Классы контейнеров C++<vector>
Введение
Стандартная библиотека шаблонов C++ (STL) — важная часть C++, предоставляющая набор обобщённых шаблонных классов и функций для работы с коллекциями данных.<vector>Это класс-контейнер в STL, используемый для хранения массивов динамического размера.
<vector>Это последовательный контейнер, позволяющий пользователям быстро добавлять или удалять элементы в конце контейнера. По сравнению с массивами,<vector>он предоставляет больше возможностей, таких как автоматическое изменение размера, произвольный доступ и так далее.
Синтаксис
В C++, используя<vector>Необходимо включить заголовочный файл<<vector>>. Ниже приведён некоторый базовый синтаксис:
-
Объявите
vector:std::vector<int> myVector;
-
Добавьте элементы:
myVector.push_back(10);
-
Доступ к элементам:
int firstElement = myVector[0];
-
Получите количество элементов:
size_t size = myVector.size();
-
Понятно
vector:myVector.clear();
Объявление и инициализация
<vector>Тип элемента должен быть указан, и его можно инициализировать несколькими способами:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1; // 空的vector
std::vector<int> vec2(5); // 长度为5的vector,元素默认初始化
std::vector<int> vec3(5, 10); // 长度为5的vector,元素值为10
std::vector<int> vec4 = {1, 2, 3, 4}; // 使用初始化列表初始化
return 0;
}
Пример
Ниже приведён пример использования<vector>простого примера, включая результаты вывода.
Пример
#include <vector>
int main() {
// Объявите vector, который хранит целые числа
std::vector<int> numbers;
// Добавить элементы
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// Выведите элементы vector
std::cout << "Вектор содержит: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// Добавить больше элементов
numbers.push_back(40);
numbers.push_back(50);
// Снова вывести элементы вектора
std::cout << "После добавления дополнительных элементов вектор содержит: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// Доступ к определённому элементу
std::cout << "Первый элемент: " << numbers[0] << std::endl;
// Очистить вектор
numbers.clear();
// Проверить, пуст ли вектор
if (numbers.empty()) {
std::cout << "Вектор теперь пуст." << std::endl;
}
return 0;
}
Вывод:
Vector contains: 10 20 30 After adding more elements, vector contains: 10 20 30 40 50 The first element is: 10 The vector is now empty.
Общие функции-члены
Ниже приведены<vector>Некоторые часто используемые функции-члены в:
| Функция | Описание |
|---|---|
push_back(const T& val) |
Добавить элемент в конец |
pop_back() |
Удаление последнего элемента |
at(size_t pos) |
Возвращает элемент в указанной позиции с проверкой границ |
operator[] |
Возвращает элемент в указанной позиции без проверки границ |
front() |
Возвращает первый элемент |
back() |
Возвращает последний элемент |
data() |
Возвращает указатель на базовый массив |
size() |
Возвращает текущее количество элементов |
capacity() |
Возвращает текущую выделенную ёмкость |
reserve(size_t n) |
Резервирует как минимумnПространство для хранения элементов |
resize(size_t n) |
Изменяет количество элементов наn |
clear() |
Очистить все элементы |
insert(iterator pos, val) |
Вставляет элемент в указанную позицию |
erase(iterator pos) |
Удаляет элемент в указанной позиции |
begin() / end() |
Возвращает итераторы begin/end |
Пример
1. Основные операции
Пример
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// Вывести все элементы
std::cout << "Элементы вектора: ";
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
// Получить первый и последний элементы
std::cout << "Первый элемент: " << vec.front() << std::endl;
std::cout << "Последний элемент: " << vec.back() << std::endl;
return 0;
}
2. Динамическое добавление и удаление элементов
Пример
#include <vector>
int main() {
std::vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
std::cout << "Размер вектора: " << vec.size() << std::endl;
std::cout << "Вместимость вектора: " << vec.capacity() << std::endl;
// Удалить последний элемент
vec.pop_back();
std::cout << "После pop_back, размер: " << vec.size() << std::endl;
return 0;
}
3. Проверка границ и безопасный доступ
Пример
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
try {
std::cout << vec.at(2) << std::endl; // Обычный вывод
std::cout << vec.at(5) << std::endl; // Выход за границы, выбрасывает исключение
} catch (const std::out_of_range& e) {
std::cout << "Исключение: " << e.what() << std::endl;
}
return 0;
}
4. Предварительное выделение емкости
Пример
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve(10); // Зарезервировать емкость, чтобы избежать частых выделений памяти
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
std::cout << "Емкость после push_back(" << i << "): " << vec.capacity() << std::endl;
}
return 0;
}
Сравнение с другими контейнерами
| Особенности | std::vector | std::array | std::list |
|---|---|---|---|
| Size | Динамически изменяемый | Фиксируются во время компиляции | Динамически изменяемый |
| Место хранения | Непрерывная память | Непрерывная память | Несмежная память |
| Производительность доступа | Быстрый произвольный доступ | Быстрый произвольный доступ | Произвольный доступ медленный, подходит для последовательного доступа |
| Производительность вставки и удаления | Операции в конце имеют высокую производительность, на других позициях медленнее | Не поддерживается | Вставка и удаление в любой позиции выполняются сравнительно быстро |
| Способ роста памяти | Растет экспоненциально при недостатке емкости | Отсутствует | Отсутствует |
<vector>Это очень полезный контейнер в C++ STL, предоставляющий функциональность динамического массива, что делает работу с добавлением и удалением элементов более гибкой и удобной. Благодаря приведенным выше примерам новички могут быстро разобраться<vector>основы его использования и операций. По мере обучения вы откроете<vector>его мощные возможности и широкий спектр применения в практическом программировании.