Для добавления элементов в вектор применяется функция push_back(), в которую передается добавляемый элемент:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> numbers; // пустой вектор
numbers.push_back(5);
numbers.push_back(3);
numbers.push_back(10);
for(int n : numbers)
cout << n << "\t"; // 5 3 10
std::cout << std::endl;
}
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу - добавляет элемент в конец контейнера:
std::vector<int> numbers{ 1, 2, 3, 4, 5 };
numbers.emplace_back(8); // numbers = { 1, 2, 3, 4, 5, 8 };
Ряд функций позволяет добавлять элементы на определенную позицию.
emplace(pos, value): вставляет элемент value на позицию, на которую указывает итератор pos
insert(pos, value): вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
insert(pos, n, value): вставляет n элементов value начиная с позиции, на которую указывает итератор pos
insert(pos, begin, end): вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
insert(pos, values): вставляет список значений начиная с позиции, на которую указывает итератор pos
Функция emplace:
std::vector<int> numbers{ 1, 2, 3, 4, 5 };
auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент
numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = { 1, 2, 8, 3, 4, 5};
Функция insert:
std::vector<int> numbers1{ 1, 2, 3, 4, 5 };
auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент
numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента
//numbers1 = { 1, 2, 8, 3, 4, 5};
std::vector<int> numbers2 { 1, 2, 3, 4, 5 };
auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент
numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки
//numbers2 = { 1, 4, 4, 4, 2, 3, 4, 5};
std::vector<int> values { 10, 20, 30, 40, 50 };
std::vector<int> numbers3 { 1, 2, 3, 4, 5 };
auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент
// добавляем после первого элемента три первых элемента из вектора values
numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3);
//numbers3 = { 1, 10, 20, 30, 2, 3, 4, 5};
std::vector<int> numbers4 { 1, 2, 3, 4, 5 };
auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом
// добавляем в конец вектора numbers4 элементы из списка { 21, 22, 23 }
numbers4.insert(iter4, { 21, 22, 23 });
//numbers4 = { 1, 2, 3, 4, 5, 21, 22, 23};
Если необходимо удалить все элементы вектора, то можно использовать функцию clear:
std::vector<int> v { 1,2,3,4 };
v.clear();
Функция pop_back() удаляет последний элемент вектора:
std::vector<int> v { 1,2,3,4 };
v.pop_back(); // v = { 1,2,3 }
Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase(), которая имеет следующие формы:
erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
Применение функции:
std::vector<int> numbers1 { 1, 2, 3, 4, 5, 6 };
auto iter = numbers1.cbegin(); // указатель на первый элемент
numbers1.erase(iter + 2); // удаляем третий элемент
// numbers1 = { 1, 2, 4, 5, 6 }
std::vector<int> numbers2 = { 1, 2, 3, 4, 5, 6 };
auto begin = numbers2.cbegin(); // указатель на первый элемент
auto end = numbers2.cend(); // указатель на последний элемент
numbers2.erase(begin + 2, end - 1); // удаляем с третьего элемента до последнего
// numbers2 = {1, 2, 6}
Также начиная со стандарта С++20 в язык была добавлена функция std::erase(). Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго - элемент, который надо удалить:
std::vector<int> numbers3 { 1, 2, 3, 1, 5, 6 };
std::erase(numbers3, 1); // numbers3 = { 2, 3, 4, 5, 6 }
В данном случае удаляем из вектора numbers3 все вхождения числа 1.
С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> numbers{1, 2, 3};
if(numbers.empty())
std::cout << "Vector is empty" << std::endl;
else
std::cout << "Vector has size " << numbers.size() << std::endl;
}
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
resize(n): оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
resize(n, value): также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value
Применение функции:
std::vector<int> numbers1 { 1, 2, 3, 4, 5, 6 };
numbers1.resize(4); // оставляем первые четыре элемента - numbers1 = {1, 2, 3, 4}
numbers1.resize(6, 8); // numbers1 = {1, 2, 3, 4, 8, 8}
Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.
Функция assign() позволяет заменить все элементы вектора определенным набором:
std::vector<std::string> langs = { "Java", "JavaScript", "C"};
langs.assign(4, "C++"); // langs = {"C++", "C++", "C++", "C++"}
В данном случае элементы вектора заменяются набором из четырех строк "C++".
Также можно передать непосредственно набор значений, который заменит значения вектора:
std::vector<std::string> langs{ "Java", "JavaScript", "C"};
langs.assign({ "C++", "C#", "C"}); // langs = { "C++", "C#", "C"}
Еще одна функция - swap() обменивает значения двух контейнеров:
std::vector<std::string> clangs { "C++", "C#", "Java" };
std::vector<std::string> ilangs { "JavaScript", "Python", "PHP"};
clangs.swap(ilangs); // clangs = { "JavaScript", "Python", "PHP"};
for(std::string lang : clangs)
{
std::cout << lang << std::endl;
}
Векторы можно сравнивать - они поддерживают все операции сравнения: <, >, <=, >=, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
std::vector<int> v1 {1, 2, 3};
std::vector<int> v2 {1, 2, 3};
std::vector<int> v3 {3, 2, 1};
bool v1v2 = v1 == v2; // true
bool v1v3 = v1 != v3; // true
bool v2v3 = v2 == v3; // false