Операции с векторами
Добавление элементов в вектор
Для добавления элементов в вектор применяется функция push_back(), в который передается добавляемый элемент:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
return 0;
}
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу - добавляет элемент в конец контейнера:
1
2
std::vector<int> numbers1 = { 1, 2, 3, 4, 5 };
numbers1.emplace_back(8); // numbers1 = { 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:
1
2
3
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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:
1
2
std::vector<int> v = { 1,2,3,4 };
v.clear();
Функция pop_back() удаляет последний элемент вектора:
1
2
std::vector<int> v = { 1,2,3,4 };
v.pop_back(); // v = { 1,2,3 }
Если нужно удалить элемент из середины или начала контейнера, применяется функция erase(), которая имеет следующие формы:
erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
Применение функции:
1
2
3
4
5
6
7
8
9
10
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}
Размер вектора
С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
int main()
{
vector<int> numbers = {1, 2, 3};
if(numbers.empty())
cout << "Vector is empty" << endl;
else
cout << "Vector has size " << numbers.size() << endl;
return 0;
}
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
resize(n): оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
resize(n, value): также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value
Применение функции:
1
2
3
4
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() позволяет заменить все элементы вектора определенным набором:
1
2
std::vector<std::string> names = { "Tom", "Bob", "Kate"};
names.assign(4, "Sam"); // numbers = {"Sam", "Sam", "Sam", "Sam"}
В данном случае элементы вектора заменяются набором из четырех строк "Sam".
Еще одна функция - swap() обменивает значения двух контейнеров:
1
2
3
4
5
6
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 n : clangs)
std::cout << n << "\t";
std::cout << std::endl;
Сравнение векторов
Векторы можно сравнивать. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
1
2
3
4
5
6
7
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