Операции с векторами

Последнее обновление: 21.02.2023

Добавление элементов в вектор

Для добавления элементов в вектор применяется функция 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
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850