Как использовать вектор C ++

How Use C Vector



Вступление

Массив - это серия объектов одного и того же типа в последовательных ячейках памяти. Массив не может увеличить длину руды. Вектор похож на массив, но его длина может быть увеличена или уменьшена. Следовательно, вектор имеет гораздо больше операций, чем массив.

C ++ имеет множество библиотек, каждая из которых составляет стандартную библиотеку C ++. Одна из этих библиотек - это библиотека контейнеров. Контейнер - это набор объектов, и с этой коллекцией можно выполнять определенные операции. Контейнеры C ++ можно сгруппировать в два набора: контейнеры последовательности и ассоциативные контейнеры. Контейнеры последовательности - это vector, array (не тот массив, который обсуждался ранее), deque, forward_list и list. Это разные коллекции (структуры данных, подобные массивам), и каждая предлагает различные компромиссы.







Любой программист должен знать, как решить, использовать ли вектор, массив, двухстороннюю очередь, forward_list или список. Когда программисту нужна структура, которая требует больше операций, чем те, которые связаны с обычным массивом, обычный массив использовать не следует.



Если задача включает частые вставки и удаления в середине последовательности, следует использовать список или forward_list. Если задача включает частые вставки и удаления в начале или конце последовательности, следует использовать двухстороннюю очередь. Вектор следует использовать, когда такого рода операции не требуются.



В этой статье показано, как использовать вектор C ++. Для понимания этой статьи вам потребуются некоторые знания указателей, ссылок и массивов C ++.





Класс и объекты

Класс - это набор переменных и функций, которые работают вместе, где переменным не присвоены значения. Когда переменным присваиваются значения, класс становится объектом. Различные значения, присвоенные одному и тому же классу, приводят к разным объектам; то есть разные объекты могут принадлежать к одному классу, но иметь разные значения. Создание объекта из класса также известно как создание экземпляра объекта.

Термин вектор описывает класс. Объект, созданный из вектора, имеет имя, выбранное программистом.



Функция, принадлежащая классу, необходима для создания экземпляра объекта из класса. В C ++ эта функция имеет то же имя, что и имя класса. Различные объекты, созданные (экземпляры) из класса, имеют разные имена, данные каждому из них программистом.

Создание объекта из класса означает создание объекта; это также означает создание экземпляра объекта.

Класс Vector

Векторный класс уже определен и находится в библиотеке. Чтобы использовать векторный класс, программист должен включить векторный заголовок в файл со следующей директивой предварительной обработки:

#включают

После включения заголовка становятся доступны все векторные функции (элементы данных и функции-члены). Чтобы использовать объект счетчика для вывода данных на терминал (консоль), также должен быть включен заголовок объекта. Чтобы написать программу с вектором, как минимум должны быть включены следующие заголовки:

#включают
#включают

Создание экземпляра вектора

intфу[10];

Выше объявление массива с именем foo и количеством элементов 10. Это массив целых чисел. Объявление вектора аналогично. Для вектора количество элементов не является обязательным, поскольку длина вектора может увеличиваться или уменьшаться.

На этом этапе программы векторный класс уже определен в библиотеке, и заголовок включен. Вектор может быть создан следующим образом:

часы::вектор <int>vtr(8);

Здесь вектор принадлежит специальной функции-конструктору. Тип данных, которые будет содержать вектор, - int в угловых скобках. Термин vtr - это имя, выбранное программистом для вектора. Наконец, 8 в скобках - это ориентировочное количество целых чисел, которые будет иметь вектор.

Термин std означает стандартное пространство имен. В этом контексте после этого термина должно стоять двойное двоеточие. Кто угодно может написать свою собственную библиотеку векторных классов и использовать ее. Однако в C ++ уже есть стандартная библиотека со стандартными именами, включая vector. Чтобы использовать стандартное имя, перед стандартным именем должен стоять std ::. Чтобы избежать ввода std :: каждый раз в программе для стандартного имени, файл программы может запускаться следующим образом:

#включают
#включают
используя пространство имен std;

Перегрузка функции

Когда две или более разных сигнатур функций имеют одно и то же имя, это имя считается перегруженным. Когда вызывается одна функция, количество и тип аргументов определяют, какая функция выполняется.

Построение вектора

Построение вектора означает инстанцирование (создание) векторного объекта. Функция-конструктор перегружается следующим образом:

имя вектора

Это создает вектор нулевой длины и типа T. Следующий оператор создает вектор нулевой длины типа float с именем vtr:

вектор<плавать>vtr;

имя вектора (n)

Это создает вектор с n элементами типа T. Оператор для этого вектора с четырьмя элементами с плавающей запятой выглядит следующим образом:

вектор<плавать>vtr(4);

имя вектора (n, t)

Это создает вектор из n элементов, инициализированных значением t. Следующий оператор создает вектор из 5 элементов, каждый из которых имеет значение 3,4:

вектор<плавать>vtr(5, 3,4);

Конструирование с инициализацией

Вектор может быть сконструирован (создан) и инициализирован одновременно одним из следующих двух способов:

вектор<плавать>vtrзнак равно {1.1, 2.2, 3.3, 4.4};

Или

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};

Обратите внимание, что сразу после имени объекта скобок нет. Круглые скобки, используемые сразу после имени объекта, должны содержать список инициализаторов, как показано ниже:

вектор<плавать>vtr({1.1, 2.2, 3.3, 4.4});

Вектор может быть создан и инициализирован позже с помощью списка инициализаторов. В этом случае круглые скобки использоваться не будут:

вектор<плавать>vtr;
vtrзнак равно {1.1, 2.2, 3.3, 4.4};

вектор V2 (V1)

Это конструктор копирования. Он создает вектор V2 как копию вектора V1. Следующий код иллюстрирует это:

вектор<плавать>vtr1(5, 3,4);
вектор<плавать>vtr2(vtr1);

Назначение вектора во время строительства

Во время построения может быть создан пустой вектор, в то время как ему назначен другой, следующим образом:

вектор<плавать>vtr1{1.1, 2.2, 3.3, 4.4};
вектор<плавать>vtr2знак равноvtr1;

Второй оператор эквивалентен:

вектор<плавать>vtr2знак равно {1.1, 2.2, 3.3, 4.4};

const Вектор

Константный вектор - это вектор, элементы которого не могут быть изменены. Значения в этом векторе доступны только для чтения. При создании вектор выглядит следующим образом:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};

В этом векторном типе ни один элемент не может быть добавлен или удален. Более того, никакое значение не может быть изменено.

Конструирование с помощью Iterator

Шаблон предоставляет общее представление для типа данных. Итератор обеспечивает общее представление сканирования значений контейнера. Синтаксис для создания вектора с итератором следующий:

шаблон<класс InputIterator>
вектор(Сначала InputIterator,InputIterator последний,constРаспределитель& знак равноРаспределитель());

Это создает вектор для диапазона [первый, последний) с использованием указанного распределителя, который будет обсуждаться позже в этой статье.

Уничтожение вектора

Чтобы уничтожить вектор, просто позвольте ему выйти из области видимости, и уничтожение будет выполнено автоматически.

Емкость вектора

size_type capacity () const noexcept

Общее количество элементов, которые вектор может содержать без необходимости перераспределения, возвращается функцией-членом емкости. Сегмент кода для этого выглядит следующим образом:

вектор<плавать>vtr(4);
intна однойзнак равноvtr.емкость();
Стоимость<<на одной<< ' п';

Выход 4.

резерв (n)

Пространство памяти не всегда доступно. Дополнительное место можно зарезервировать заранее. Рассмотрим следующий фрагмент кода:

вектор<плавать>vtr(4);
vtr.бронировать(6);
Стоимость<<vtr.емкость() << ' п';

Результатом будет 6. Таким образом, зарезервировано дополнительное пространство 6 - 4 = 2 элемента. Функция возвращает void.

size () const noexcept

Это возвращает количество элементов в векторе. Следующий код иллюстрирует эту функцию:

вектор<плавать>vtr(4);
плаватьsзнак равноvtr.размер();
Стоимость<<s<< ' п';

Выход 4.

Уменьшать до размеров()

После предоставления дополнительной емкости вектору с помощью функции reserve () размер вектора можно уменьшить, чтобы он соответствовал его исходному размеру. Следующий код иллюстрирует это:

вектор<плавать>vtr(4);
vtr.бронировать(6);
vtr.Уменьшать до размеров();
intsзнак равноvtr.размер();
Стоимость<<s<< ' п';

На выходе будет 4, а не 6. Функция возвращает void.

изменить размер (sz), изменить размер (sz, c)

Это изменяет размер вектора. Если новый размер меньше старого, то элементы ближе к концу стираются. Если новый размер больше, то в конце добавляется какое-то значение по умолчанию. Чтобы добавить определенную ценность, используйте функцию resize () с двумя аргументами. Следующий фрагмент кода иллюстрирует использование этих двух функций:

вектор<плавать>vtr1{1.1, 2.2, 3.3, 4.4};
vtr1.изменить размер(2);
Стоимость<< 'Новый размер vtr1:' <<vtr1.размер() << ' п';
вектор<плавать>vtr2{1.1, 2.2};
vtr2.изменить размер(4, 8,8);
Стоимость<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' п';

Результат следующий:

Новый размер vtr1: 2
vtr2: 1,1 2,2 8,8 8,8

Функции возвращают void.

пустой () const noexcept

Эта функция возвращает 1 для истины, если в векторе нет элементов, и 0 для false, если вектор пуст. Если вектор имеет 4 местоположения для определенного типа данных, например, с плавающей запятой, без какого-либо значения с плавающей запятой, то этот вектор не является пустым. Следующий код иллюстрирует это:

вектор<плавать>vtr;
Стоимость<<vtr.пустой() << ' п';
вектор<плавать>vt(4);
Стоимость<<так чтопустой() << ' п';

вектор<плавать>v(4,3.5);
Стоимость<<v.пустой() << ' п';

Результат следующий:

1
0
0

Доступ к элементу вектора

Вектор может быть подписан (проиндексирован) как массив. Подсчет индекса начинается с нуля.

vectorName [i]

Операция vectorName [i] возвращает ссылку на элемент в ithиндекс вектора. Следующий код выводит 3.3 для указанного выше вектора:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr[2];
Стоимость<<эт<< ' п';

vectorName [i] const

Операция vectorName [i] const выполняется вместо vectorName [i], когда вектор является постоянным вектором. Эта операция используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr[2];
Стоимость<<эт<< ' п';

Выражение возвращает постоянную ссылку на ithэлемент вектора.

Присвоение значения с помощью нижнего индекса

Значение может быть присвоено непостоянному вектору следующим образом:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
vtr[2] знак равно 8,8;
Стоимость<<vtr[2] << ' п';

На выходе получается 8.8.

vectorName.at (i)

vectorName.at (i) похож на vectorName [i], но vectorName.at (i) более надежен. Следующий код показывает, как следует использовать этот вектор:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.в(2);
Стоимость<<эт<< ' п';
в()является членом векторафункция.

vectorName.at (i) const

vectorName.at (i) const похож на vectorName [i] const, но vectorName.at (i) const более надежен. vectorName.at (i) const выполняется вместо vectorName.at (i), когда вектор является постоянным вектором. Этот вектор используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.в(2);
Стоимость<<эт<< ' п';
в() constявляется членом векторафункция.

Присвоение значения с помощью функции at ()

Значение может быть присвоено непостоянному вектору с помощью функции at () следующим образом:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
vtr.в(2) знак равно 8,8;
Стоимость<<vtr[2] << ' п';

На выходе получается 8.8.

Проблема с подпрограммами

Проблема с дополнительными сценариями (индексированием) заключается в том, что если индекс выходит за пределы допустимого диапазона, может быть возвращен ноль или может возникнуть ошибка во время выполнения.

передний()

Это возвращает ссылку на первый элемент вектора без удаления элемента. Результатом следующего кода является 1.1.

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.передний();
Стоимость<<эт<< ' п';

Элемент не удаляется из вектора.

фронт () const

Когда конструкции вектора предшествует const, выражение front () const выполняется вместо front (). Это используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.передний();
Стоимость<<эт<< ' п';

Возвращается постоянная ссылка. Элемент не удаляется из вектора.

назад()

Это возвращает ссылку на последний элемент вектора без удаления элемента. Вывод следующего кода - 4.4.

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.назад();
Стоимость<<эт<< ' п';

назад () const

Когда конструкции вектора предшествует const, выражение back () const выполняется вместо back (). Это используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
плаватьэтзнак равноvtr.назад();
Стоимость<<эт<< ' п';

Возвращается постоянная ссылка. Элемент не удаляется из вектора.

Доступ к векторным данным

data () noexcept; data () const noexcept;

Любой из них возвращает указатель, так что [data (), data () + size ()) является допустимым диапазоном.

Подробнее об этом мы поговорим позже.

Возвращение итераторов и вектора

Итератор похож на указатель, но имеет больше функций, чем указатель.

begin () noexcept

Возвращает итератор, указывающий на первый элемент вектора, как в следующем сегменте кода:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::итераторiterзнак равноvtr.начинать();
Стоимость<< *iter<< ' п';

На выходе получается 1.1. Обратите внимание, что объявление, которое получает итератор, было объявлено. Итератор разыменовывается в возвращаемом выражении для получения значения так же, как разыменование указателя.

begin () const noexcept;

Возвращает итератор, указывающий на первый элемент вектора. Когда конструкции вектора предшествует const, выражение begin () const выполняется вместо begin (). При этом условии соответствующий элемент в векторе не может быть изменен. Это используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::const_iteratoriterзнак равноvtr.начинать();
Стоимость<< *iter<< ' п';

На выходе получается 1.1. Обратите внимание, что на этот раз const_iterator был использован вместо простого итератора для получения возвращенного итератора.

конец () noexcept

Возвращает итератор, который указывает сразу за последним элементом вектора. Рассмотрим следующий фрагмент кода:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::итераторiterзнак равноvtr.конец();
Стоимость<< *iter<< ' п';

Результатом будет 0, что не имеет смысла, поскольку за последним элементом нет конкретного элемента.

конец () const noexcept

Возвращает итератор, который указывает сразу за последним элементом вектора. Когда конструкции вектора предшествует const, выражение end () const выполняется вместо end (). Рассмотрим следующий фрагмент кода:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::const_iteratoriterзнак равноvtr.конец();
Стоимость<< *iter<< ' п';

Результатом будет 0. Обратите внимание, что на этот раз был использован const_iterator вместо простого итератора для получения возвращенного итератора.

Обратная итерация

Возможно иметь итератор, который выполняет итерацию от конца до самого первого элемента.

rbegin () noexcept

Возвращает итератор, указывающий на последний элемент вектора, как в следующем сегменте кода:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::reverse_iteratorРИТЕРзнак равноvtr.rbegin();
Стоимость<< *РИТЕР<< ' п';

Выход 4.4.

Обратите внимание, что объявлено объявление, которое получает обратный итератор. Итератор разыменовывается в возвращаемом выражении для получения значения так же, как разыменование указателя.

rbegin () const noexcept;

Возвращает итератор, указывающий на последний элемент вектора. Когда конструкции вектора предшествует const, выражение rbegin () const выполняется вместо rbegin (). При этом условии соответствующий элемент в векторе не может быть изменен. Эта функция используется в следующем коде:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::const_reverse_iteratorРИТЕРзнак равноvtr.rbegin();
Стоимость<< *РИТЕР<< ' п';

Выход 4.4.

Обратите внимание, что на этот раз был использован const_reverse_iterator вместо только reverse_iterator для получения возвращенного итератора.

render () noexcept

Возвращает итератор, который указывает непосредственно перед первым элементом вектора. Рассмотрим следующий фрагмент кода:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::reverse_iteratorРИТЕРзнак равноvtr.делает();
Стоимость<< *РИТЕР<< ' п';

Результатом будет 0, что бессмысленно, поскольку непосредственно перед первым элементом нет конкретного элемента.

render () const noexcept

Возвращает итератор, который указывает непосредственно перед первым элементом вектора. Когда конструкции вектора предшествует const, выражение rend () const выполняется вместо rend (). Рассмотрим следующий фрагмент кода:

constвектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
вектор<плавать> ::const_reverse_iteratorРИТЕРзнак равноvtr.делает();
Стоимость<< *РИТЕР<< ' п';

На выходе 0.

Обратите внимание, что на этот раз был использован const_reverse_iterator вместо только reverse_iterator для получения возвращенного итератора.

Векторные модификаторы

Модификатор, изменяющий вектор, может принимать или возвращать итератор.

a.emplace (p, args)

Вставляет объект типа T, созданный с помощью std :: forward (args)… перед p.

Подробнее - см. Позже.

вставить (iteratorPosition, значение)

Вставляет копию значения в позицию итератора вектора. Возвращает итератор (позицию) в векторе, куда была помещена копия. Следующий код показывает, где было размещено значение:

вектор<int>vtr{10, двадцать, 30, 40};
вектор<int> ::итераторiterзнак равноvtr.начинать();
++iter;
++iter;
vtr.вставлять(iter, 25);
Стоимость<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3] << ' п';

Вывод: 20 25 30.

Обратите внимание, что итератор был расширен (увеличен) точно так же, как указатель.

Также можно вставить список инициализаторов, как показано в следующем коде:

вектор<int>vtr{10, двадцать, 30, 40};
вектор<int> ::итераторiterзнак равноvtr.начинать();
++iter;
++iter;
vtr.вставлять(iter, {25, 28 год});

Стоимость<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3]<< '' <<vtr[4] << ' п';

Вывод: 20 25 28 30.

стереть (положение)

Удаляет элемент в позиции, на которую указывает итератор, затем возвращает позицию итератора. Следующий код иллюстрирует это:

вектор<int>vtr{10, двадцать, 30, 40};
вектор<int> ::итераторiterзнак равноvtr.начинать();
++iter;
++iter;
vtr.стереть(iter);
Стоимость<<vtr[0] << '' <<vtr[1] << '
'
<<vtr[2]<< ' п';

Вывод: 10 20 40

push_back (t), push_back (rv)

Используется для добавления одного элемента в конец вектора. Используйте push_back (t) следующим образом:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
vtr.отталкивать(5.5);
плаватьэтзнак равноvtr[4];
Стоимость<<эт<< ' п';

Выход 5.5.

отталкивать(фургон): -увидим позже.

pop_back ()

Удаляет последний элемент, не возвращая его. Размер вектора уменьшается на 1. Следующий код иллюстрирует это:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
vtr.pop_back();
плаватьsзнак равноvtr.размер();
Стоимость<<s<< ' п';

Выход 3.

a.swap (b)

Два вектора можно поменять местами, как показано в следующем фрагменте кода:

вектор<плавать>vtr1{1.1, 2.2, 3.3, 4.4};
вектор<плавать>vtr2{10, двадцать};
vtr1.поменять местами(vtr2);
Стоимость<< 'vtr1:'<<vtr1[0] <<''<<vtr1[1] <<'
'
<<vtr1[2] <<''<<vtr1[3] << ' п';

Стоимость<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' п';

Результат:

vtr1: 10 двадцать 0 0
vtr2: 1.1 2.2 3.3 4.4

Обратите внимание, что при необходимости длина вектора увеличивается. Кроме того, значения, у которых не было замен, заменяются некоторым значением по умолчанию.

Чисто()

Удаляет все элементы из вектора, как показано в следующем сегменте кода:

вектор<плавать>vtr{1.1, 2.2, 3.3, 4.4};
vtr.Чисто();
Стоимость<<vtr.размер() << ' п';

На выходе 0.

Операторы равенства и отношения для векторов

Оператор ==

Возвращает 1 для истины, если два вектора имеют одинаковый размер и соответствующие элементы равны; в противном случае он возвращает 0 для ложного. Например:

вектор<int>U{1, 2, 3};
вектор<int>V{4, 5, 6};
bool blзнак равноU==V;
Стоимость<<бл<< ' п';

На выходе 0.

Оператор! =

Возвращает 1 для истины, если два вектора не имеют одинакового размера и / или соответствующие элементы не равны; в противном случае он возвращает 0 для ложного. Например:

вектор<int>U{1, 2, 3};
вектор<int>V{4, 5, 6};
bool blзнак равноUзнак равноV;
Стоимость<<бл<< ' п';

Выход 1.

В

Возвращает 1 для истины, если первый вектор является начальным подмножеством второго вектора, причем элементы двух равных частей одинаковы и находятся в одном порядке. Если оба вектора имеют одинаковый размер и движутся слева направо, и в первом векторе встречается элемент, который меньше соответствующего элемента во втором векторе, то все равно будет возвращено 1. В противном случае возвращается 0 для false. Например:

вектор<int>U{3, 1, 1};
вектор<int>V{3, 2, 1};
bool blзнак равноU<V;
Стоимость<<бл<< ' п';

Выход 1.

Оператор>

Возврат! (U

В<= Operator

Возвращает U<= V, where U is the first vector and V is the second vector, according to the above definitions.

Оператор> =

Возврат! (U<= V), where U is the first vector and V is the second vector, according to the above definitions.

Заключение

Вектор - это пример контейнера последовательности. Вектор является лучшей формой обычного массива и создается из класса. У векторов есть методы, которые классифицируются по следующим категориям: построение и присвоение, емкость, доступ к элементам, доступ к данным, итераторы, модификаторы и числовые перегруженные операторы.

Существуют и другие контейнеры последовательности, называемые списком, forward_list и массивом. Если задача включает частые вставки и удаления в середине последовательности, следует использовать список или forward_list. Если задача включает частые вставки и удаления в начале или конце последовательности, следует использовать двухстороннюю очередь. Итак, векторы следует использовать только тогда, когда такого рода операции не важны.