Вектор

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

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

#include <vector>

Определим простейший вектор:

std::vector<int> numbers;

В угловых скобках указывается тип, объекты которого будут храниться в векторе. То есть вектор numbers хранит объекты типа int. Однако такой вектор пуст. Он не содержит никаких элементов.

Но мы можем инициализировать вектор одним из следующих способов:

std::vector<int> v1;				// пустой вектор
std::vector<int> v2(v1);			// вектор v2 - копия вектора v1
std::vector<int> v3 = v1;			// вектор v3 - копия вектора v1
std::vector<int> v4(5);			// вектор v4 состоит из 5 чисел, каждое число равно 0
std::vector<int> v5(5, 2);		// вектор v5 состоит из 5 чисел, каждое число равно 2
std::vector<int> v6{1, 2, 4, 5};	// вектор v6 состоит из чисел 1, 2, 4, 5
std::vector<int> v7 = {1, 2, 3, 5}; // вектор v7 состоит из чисел 1, 2, 3, 5

Важно понимать отличие в данном случае круглых скобок от фигурных:

std::vector<int> v1(5);		// вектор состоит из 5 чисел, каждое число в векторе равно 0
std::vector<int> v2{5};		// вектор состоит из одного числа, которое равно 5
std::vector<int> v3(5, 2);	// вектор состоит из 5 чисел, каждое число равно 2
std::vector<int> v4{5, 2};	// вектор состоит из двух чисел 5 и 2

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

std::vector<int> v{5, "hi"};

Обращение к элементам и их перебор

Для обращения к элементам вектора можно использовать разные способы:

  • [index]: получение элемента по индексу (также как и в массивах), индексация начинается с нуля

  • at(index): функция возращает элемент по индексу

  • front(): возвращает первый элемент

  • back(): возвращает последний элемент

Выполним перебор вектора и получим некоторые его элементы:

#include <iostream>
#include <vector>
 
int main()
{
	std::vector<int> numbers {1, 2, 3, 4, 5};
	
	int first = numbers.front();	// 1
	int last = numbers.back();		// 5
	int second = numbers[1]; 		// 2
	std::cout << "first: " << first << std::endl;
	std::cout << "second: " << second << std::endl;
	std::cout << "last: " << last << std::endl;

	numbers[0] = 6;  // изменяем значение	
	for(int n : numbers)
		std::cout << n << "\t";	// 6  2  3  4  5
	
    std::cout << std::endl;
}

При этом следует учитывать, что индексация не добавляет элементов. Например, если вектор содержит 5 элементов, то мы не можем обратиться к шестому элементу:

std::vector<int> numbers {1, 2, 3, 4, 5};
numbers[5] = 9;

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

Чтобы избежать подобных ситуаций, можно использовать функцию at(), которая хотя также возвращает элемент по индексу, но при попытке обращения по недопустимому индексу будет генерировать исключение out_of_range:

#include <iostream>
#include <vector>
#include <stdexcept>

int main()
{
	std::vector<int> numbers { 1, 2, 3, 4, 5};
	try
	{
		int n = numbers.at(8);
	}
	catch (std::out_of_range e)
	{
		std::cout << "Incorrect index" << std::endl;
	}
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850