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++.