Чаще всего требуется использовать массивы неопределенного размера. В таких случаях будет затратно использовать обычный массив, и выделять фиксированный объем памяти для него. Именно поэтому для таких целей подойдет вектор (vector).

Для использования векторов необходимо включить соответствующий заголовок и объявление using.

#include <vector>
using std::vector;

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

vector<int> vec1; //vec1 содержит объекты типа int
vector<string> vec2; //vec2 содержит объекты типа string
vector<vector<int>> vec3; //вектор, содержащий другие вектора
 

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

Способы инициализации векторов
vector<T> v1 Вектор, содержащий объекты типа T
vector<T> v2(v1) Вектор v2 - копия всех элементов вектора v1
vector<T> v2 = v1 Эквивалент v2(v1), v2 - копия элементов вектора v1
vector<T> v3(n, val) Вектор v3 содержит n элементов со значением val
vector<T> v4(n) Вектор v4 содержит n элементов типа T, инициализированного значением по умолчанию
vector<T> v5{a,b,c ...} Вектор v5 содержит столько элементов, сколько предоставлено инициализаторов
vector<T> v5 = {a,b,c ...} Эквивалент v5{a,b,c …}

Все элементы вектора должны иметь один тип создаваемых значений.

Следует различать инициализацию с разными скобками () и {}.

В случае использования int

vector<int> v1(10); //v1 имеет десять элементов со значением 0
vector<int> v2{10}; //v2 имеет один элемент со значением 10
vector<int> v3(10, 1); //v3 имеет 10 элементов со значением 1
vector<int> v4{10, 1}; //v4 имеет два элемента со значениями 10 и 1
 

В случае использования string

vector<string> v5{"hi"}; //v5 имеет 1 элемент (списочная инициализация)
vector<string> v6("hi"); //ошибка, нельзя создать вектор из строкового литерала
vector<string> v7{10}; //v7 имеет 10 элементов со значением по умолчанию
vector<string> v8(10, "hi"); //v8 имеет 10 элементов со значением "hi"
 

Если необходимо создать вектор со значениями от 0 до 9, то можно легко использовать списочную инициализацию. Но что же делать, если необходимы элементы от 0 до 99 или от 0 до 999? Списочная инициализация будет слишком громоздкой. В таком случае необходимо создать пустой вектор и использовать функцию push_back(), чтобы добавлять элементы во время выполнения.

Функция push_back() вставляет переданное ей значение в вектор как новый последний элемент. Например:

vector<int> vec1; //пустой вектор
for (int i = 0; i < 100; i++)
 vec1.push_back(i)
//по завершении цикла vec1 имеет 100 элементов со значениями от 0 до 99
 

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

string word;
vector<string> text; //пустой вектор
while (cin >> word) {
 text.push_back(word); //добавить word в text
}
 


 Похожие публикации
2016-02-13 • Просмотров [ 423 ]