Вы находитесь на странице: 1из 4

1

Векторы

Предназначение вектора

Вектор это последовательный контейнерный класс стандартной библиотеки


STL. Вектор — это тот же динамический массив, но который может сам управлять
выделенной себе памятью. Это означает, что вы можете создавать массивы, длина
которых задается во время выполнения, без использования операторов new и delete
(явного указания выделения и освобождения памяти). std::vector находится в
заголовочном файле vector.
Объявление std::vector следующее:
#include <vector>
// Нет необходимости указывать длину при инициализации
std::vector<int> array;
std::vector<int> array2 = {10, 8, 6, 4, 2, 1};
std::vector<int> array3 {10, 8, 6, 4, 2, 1};

Основные методы векторов:


В отличие от стандартных динамических массивов, которые не знают свою
длину, std::vector свою длину запоминает. Чтобы её узнать, нужно использовать
функцию size():
std::vector<int> array {12, 10, 8, 6, 4, 2, 1};
std::cout << "Текущая длина: " << array.size() << '\n';
// Текущая длина: 7

Изменить длину стандартного динамически выделенного массива довольно


проблематично и сложно. Изменить длину std::vector так же просто, как вызвать
функцию resize():
std::vector<int> array {0, 1, 4, 7, 9, 11};
array.resize(4); // Изменяем длину array на 4
// Новый массив: {0, 1, 4, 7}

Чтобы добавить элемент в конец вектора, можно воспользоваться функцией


push_back():
std::vector<int> array {0, 1, 4, 7, 9, 11};
array.push_back(7); // Добавляем 7 в конец array
// Новый массив: {0, 1, 4, 7, 9, 11, 7}

Удалить последний элемент вектора можно функцией pop_back():


std::vector<int> array {0, 1, 4, 7, 9, 11};
array.pop_back(7); // Удаляем последний элемент array
// Новый массив: {0, 1, 4, 7, 9}
2

Основные отличия от других контейнеров

Vector используется для хранения данных одного типа с возможностью


увеличения размера по мере необходимости. Также в векторе легко осуществить
доступ к случайному элементу.

Последовательные контейнеры:
 Контейнер array имеет некоторые сильные стороны vector, но обладает
фиксированной длиной.
 Контейнер deque быстрее выполняется при вставке и удалении в начале и конце
последовательности. Но он не является непрерывным.
 Контейнер list предоставляет доступ только к началу и к концу списка —
произвольный доступ запрещен. Если вы хотите найти значение где-то в
середине, то вы должны начать с одного конца и перебирать каждый элемент
списка до тех пор, пока не найдете то, что ищете. Преимуществом двусвязного
списка является то, что добавление элементов происходит очень быстро

Элементы в ассоциативных контейнерах сортируются автоматически, что


делает бессмысленным их сравнение с вектором.
 set — это контейнер, в котором хранятся только уникальные элементы, и
повторения запрещены (в отличе от multiset). Элементы сортируются в
соответствии с их значениями.
 map — это set, в котором каждый элемент является парой «ключ-значение».
«Ключ» используется для сортировки и индексации данных и должен быть
уникальным (в отличие от multimap), а «значение» — это фактические данные.

Адаптеры — это специальные предопределенные контейнерные классы,


которые адаптированы для выполнения конкретных заданий, которые также
бессмысленно сравнивать с векторами.

 stack — это контейнерный класс, элементы которого работают по принципу


LIFO (англ. «Last In, First Out» = «последним пришел, первым ушел»), т.е.
элементы добавляются (вносятся) в конец контейнера и удаляются
(выталкиваются) оттуда же (из конца контейнера).
 queue (очередь) — это контейнерный класс, элементы которого работают по
принципу FIFO (англ. «First In, First Out» = «первым пришел, первым ушел»),
т.е. элементы добавляются (вносятся) в конец контейнера, но удаляются
(выталкиваются) из начала контейнера.
3

Использование вектора

Вектор удобно использовать, когда количество элементов заранее не известно и


изменяется в ходе выполнения программы. Выбор типа контейнера должен в общем
случае производиться на основе типа поиска и вставки, который требуется
приложению. Vector должен быть предпочтительным контейнером для управления
последовательностью, если вставки или удаления элементов требуются только в конце
последовательности, а также если необходим доступ к случайному элементу.
Если требуется вставка в передней части контейнера, то эффективным выбором
бдует контейнер deque.
Если доступ к случайному элементу не требуется, то list будет более
эффективным выбором с точки зрения производительности.
Вектор, например, можно использовать для хранения…
4

Устройство вектора
В качестве основных переменных вектор хранит указатель на массив, свою
длину и свою ёмкость:
template <typename T>
class vector {
private:
T* arr;
size_t m_Size; //Количество элементов вектора
size_t m_Capacity; //Ёмкость вектора
};
Реализация основных методов

Вам также может понравиться