Классы контейнеров 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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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::vectorstd::arraystd::list
SizeДинамически изменяемыйФиксируются во время компиляцииДинамически изменяемый
Место храненияНепрерывная памятьНепрерывная памятьНесмежная память
Производительность доступаБыстрый произвольный доступБыстрый произвольный доступПроизвольный доступ медленный, подходит для последовательного доступа
Производительность вставки и удаленияОперации в конце имеют высокую производительность, на других позициях медленнееНе поддерживаетсяВставка и удаление в любой позиции выполняются сравнительно быстро
Способ роста памятиРастет экспоненциально при недостатке емкостиОтсутствуетОтсутствует

<vector>Это очень полезный контейнер в C++ STL, предоставляющий функциональность динамического массива, что делает работу с добавлением и удалением элементов более гибкой и удобной. Благодаря приведенным выше примерам новички могут быстро разобраться<vector>основы его использования и операций. По мере обучения вы откроете<vector>его мощные возможности и широкий спектр применения в практическом программировании.

Другие расширения