Чаще всего требуется использовать массивы неопределенного размера. В таких случаях будет затратно использовать обычный массив, и выделять фиксированный объем памяти для него. Именно поэтому для таких целей подойдет вектор (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
}