X Tutup
The Wayback Machine - https://web.archive.org/web/20211020210137/https://ru.cppreference.com/w/cpp/container/vector
Пространства имён
Варианты
Действия

std::vector

Материал из cppreference.com
< cpp‎ | container
 
 
Библиотека контейнеров
Последовательные
(C++11)
vector
Ассоциативные
Неупорядоченные ассоциативные
Адаптеры
Представления
(C++20)
 
 
Определено в заголовочном файле <vector>
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template <class T>
    using vector = std::vector<T, std::polymorphic_allocator<T>>;

}
(2) (начиная с C++17)
1) std::vector это последовательный контейнер, инкапсулирующий массивы переменного размера.
2) std::pmr::vector это псевдоним шаблона, который используюет полиморфный аллокатор.

Элементы хранятся непрерывно, а значит доступны не только через итераторы, но и с помощью смещений для обычных указателей на элементы. Это означает, что указатель на элемент вектора может передаваться в любую функцию, ожидающую указатель на элемент массива.

Память вектора обрабатывается автоматически, расширяясь и сжимаясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, поскольку больше памяти выделяется для обработки будущего роста. Таким образом, память для вектора требуется выделять не при каждой вставке элемента, а только после исчерпания дополнительной памяти. Общий объём выделенной памяти можно получить с помощью функции capacity(). Дополнительную память можно вернуть системе с помощью вызова shrink_to_fit(). (начиная с C++11)

Перераспределение обычно является дорогостоящей операцией с точки зрения производительности. Функцию reserve() можно использовать для исключения перераспределения, если количество элементов известно заранее.

Сложность (эффективность) обычных операций над векторами следующая:

  • Произвольный доступ — постоянная 𝓞(1)
  • Вставка и удаление элементов в конце — амортизированная постоянная 𝓞(1)
  • Вставка и удаление элементов — линейная по расстоянию до конца вектора 𝓞(n)

std::vector (для T кроме bool) соответствует требованиям Container, AllocatorAwareContainer, SequenceContainer , ContiguousContainer (начиная с C++17) и ReversibleContainer.

Функции-элементы std::vector являются constexpr: можно создавать и использовать объекты std::vector при оценке константного выражения.

Однако объекты std::vector обычно не могут быть constexpr, потому что любая динамически выделяемая память должна освобождаться при той же оценке константного выражения.

(начиная с C++20)

Содержание

[править] Параметры шаблона

T Тип элементов.
T должен соответствовать требованиям CopyAssignable и CopyConstructible. (до C++11)
Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых с контейнером. Как правило, требуется, чтобы тип элемента был полным типом и отвечал требованиям Erasable, но многие функции-элементы предъявляют более строгие требования. (начиная с C++11)
(до C++17)
Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента соответствовал требованиям Erasable, но многие функции-элементы предъявляют более строгие требования. Этот контейнер (но не его элементы) может быть создан с неполным типом элемента, если аллокатор соответствует требованиям к завершённости аллокатора. (начиная с C++17)

[править]

Allocator Аллокатор, который используется для получения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен соответствовать требованиям Allocator. Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если Allocator::value_type не совпадает с T. [править]

[править] Специализации

Стандартная библиотека предоставляет специализацию std::vector для типа bool, которая может быть оптимизирована для экономии места.

компактный динамический битовый набор
(специализация шаблона класса) [править]

[править] Аннулирование итератора

Операции Недействителен
Все операции только для чтения Ни один
swap, std::swap end()
clear, operator=, assign Все
reserve, shrink_to_fit Если вектор изменил ёмкость, то все. Если не изменил, то ни один.
erase Удалённые элементы и все элементы после них (включая end())
push_back, emplace_back Если вектор изменил ёмкость, то все. Если нет, то только end().
insert, emplace Если вектор изменил ёмкость, то все. Если нет, только те, которые находятся в точке вставки или после неё (включая end()).
resize Если вектор изменил ёмкость, то все. Если нет, то только end() и все удалённые элементы.
pop_back Удалённый элемент и end().

[править] Типы элементы

Тип элемент Определение
value_type T [править]
allocator_type Allocator [править]
size_type Беззнаковый целочисленный тип (обычно std::size_t) [править]
difference_type Знаковый целочисленный тип (обычно std::ptrdiff_t) [править]
reference value_type& [править]
const_reference const value_type& [править]
pointer
Allocator::pointer (до C++11)
std::allocator_traits<Allocator>::pointer (начиная с C++11)
[править]
const_pointer
Allocator::const_pointer (до C++11)
std::allocator_traits<Allocator>::const_pointer (начиная с C++11)
[править]
iterator LegacyRandomAccessIterator для value_type [править]
const_iterator LegacyRandomAccessIterator для const value_type [править]
reverse_iterator std::reverse_iterator<iterator> [править]
const_reverse_iterator std::reverse_iterator<const_iterator> [править]

[править] Функции элементы

создаёт vector
(public функция-элемент) [править]
уничтожает vector
(public функция-элемент) [править]
присваивает значения контейнеру
(public функция-элемент) [править]
присваивает значения контейнеру
(public функция-элемент) [править]
возвращает связанный аллокатор
(public функция-элемент) [править]
Доступ к элементам
предоставляет доступ к указанному элементу с проверкой границ
(public функция-элемент) [править]
предоставляет доступ к указанному элементу
(public функция-элемент) [править]
предоставляет доступ к первому элементу
(public функция-элемент) [править]
предоставляет доступ к последнему элементу
(public функция-элемент) [править]
прямой доступ к базовому массиву
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]

(C++11)
возвращает итератор на конец
(public функция-элемент) [править]
возвращает обратный итератор на начало
(public функция-элемент) [править]

(C++11)
возвращает обратный итератор на конец
(public функция-элемент) [править]
Ёмкость
проверяет, пуст ли контейнер
(public функция-элемент) [править]
возвращает количество элементов
(public функция-элемент) [править]
возвращает максимально возможное количество элементов
(public функция-элемент) [править]
резервирует память
(public функция-элемент) [править]
возвращает количество элементов, которые могут храниться в выделенной в данный момент памяти
(public функция-элемент) [править]
уменьшает использование памяти за счёт освобождения неиспользуемой памяти
(public функция-элемент) [править]
Модификаторы
очищает содержимое
(public функция-элемент) [править]
вставляет элементы
(public функция-элемент) [править]
(C++11)
создаёт элемент на месте
(public функция-элемент) [править]
удаляет элементы
(public функция-элемент) [править]
добавляет элемент в конец
(public функция-элемент) [править]
создаёт элементы на месте в конце
(public функция-элемент) [править]
удаляет последний элемент
(public функция-элемент) [править]
изменяет количество хранимых элементов
(public функция-элемент) [править]
меняет местами содержимое
(public функция-элемент) [править]

[править] Функции, не являющиеся элементами


(убрано в C++20)
(убрано в C++20)
(убрано в C++20)
(убрано в C++20)
(убрано в C++20)
(C++20)
лексикографически сравнивает значения в vector
(шаблон функции) [править]
специализация алгоритма std::swap
(шаблон функции) [править]
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) [править]

[править] Принципы вывода (начиная с C++17)

[править] Пример

#include <iostream>
#include <vector>
 
int main()
{
    // Создаём вектор, содержащий целые числа
    std::vector<int> v = { 7, 5, 16, 8 };
 
    // Добавляем к вектору ещё два целых числа
    v.push_back(25);
    v.push_back(13);
 
    // Выводим вектор на экран
    std::cout << "v = { ";
    for (int n : v) {
        std::cout << n << ", ";
    }
    std::cout << "}; \n";
}

Вывод:

v = { 7, 5, 16, 8, 25, 13, };

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 69 C++98 непрерывность памяти для элементов vector'а не требуется требуется
LWG 464 C++98 доступ к базовому хранилищу пустого vector приводит к UB
(Неопределенное Поведение)
предоставлена функция data
X Tutup