Руководство по std::vector в C++

Автор: | 9 июня, 2025

std::vector — один из наиболее часто используемых контейнеров в стандартной библиотеке C++ (STL). Это динамический массив, который автоматически управляет памятью: при необходимости расширяется, а при удалении элементов — освобождает ресурсы.


1. Что такое std::vector?

std::vector — шаблонный класс, реализующий массив с динамическим размером. В отличие от обычного массива, vector может изменять свою длину во время выполнения.

Подключение:

#include <vector>

2. Объявление и инициализация

std::vector<int> numbers;                     // пустой вектор
std::vector<int> values = {1, 2, 3, 4};       // инициализация списком
std::vector<std::string> names(3, "Qt");      // 3 элемента со значением "Qt"

3. Основные методы

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

numbers.push_back(10);      // добавить элемент в конец

Доступ к элементам:

int x = numbers[0];         // без проверки границ
int y = numbers.at(1);      // с проверкой (std::out_of_range)

Размер и емкость:

numbers.size();             // количество элементов
numbers.capacity();         // текущая емкость
numbers.empty();            // true, если пустой

Удаление:

numbers.pop_back();         // удалить последний
numbers.clear();            // удалить всё

Итерация:

for (int n : numbers) {
    std::cout << n << ' ';
}

for (auto it = numbers.begin(); it != numbers.end(); ++it) {
    std::cout << *it << ' ';
}

4. Важные методы

insert() — вставка:

numbers.insert(numbers.begin() + 1, 99);   // вставить 99 на позицию 1

erase() — удаление по индексу:

numbers.erase(numbers.begin() + 2);        // удалить элемент на позиции 2

resize() — изменение количества элементов:

numbers.resize(10);                        // увеличит до 10, новые элементы инициализируются нулями
numbers.resize(3);                         // уменьшит до 3

reserve() — заранее выделить память:

numbers.reserve(1000);                     // избежать лишнего перераспределения памяти

5. Работа с пользовательскими типами

struct Point {
    int x, y;
};

std::vector<Point> points = {{0, 1}, {2, 3}, {4, 5}};

for (const auto& p : points) {
    std::cout << p.x << "," << p.y << std::endl;
}

6. Особенности внутреннего устройства

  • std::vector использует непрерывный блок памяти (как обычный массив).
  • При переполнении текущей значения, vector увеличивает размер (обычно в 1.5–2 раза) и копирует данные в новое место.
  • Удаление из середины — медленная операция (O(n)), вставка в конец — быстрая (O(1) в среднем).
  • После resize(), push_back() может вызвать реаллокацию!

7. Полезные идиомы

Очистка памяти полностью:

std::vector<int>().swap(numbers);   // очистка и обнуление capacity

Удалить все вхождения значения:

numbers.erase(std::remove(numbers.begin(), numbers.end(), 5), numbers.end());

8. Сравнение с другими контейнерами

КонтейнерОсобенности
std::vectorБыстрый доступ по индексу, медленная вставка в середину
std::listБыстрая вставка/удаление, но нет прямого доступа
std::dequeДоступ с обоих концов, но чуть медленнее вектора
std::arrayФиксированный размер, stack allocation

9. Когда использовать std::vector?

Используйте std::vector, когда:

  • вам нужен массив, размер которого меняется во время выполнения;
  • важен быстрый доступ по индексу;
  • вставка/удаление происходит в основном в конце массива.

std::vector — это универсальный, мощный и удобный контейнер, подходящий для большинства задач, связанных с динамическими массивами. Он должен быть вашим «по умолчанию» выбором при работе с последовательностями в C++.