Namespaces
Variants

std:: vector

From cppreference.net
Определено в заголовочном файле <vector>
template <

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

> class vector ;
(1)
namespace pmr {

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

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

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

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

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

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

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

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

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

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

(начиная с C++20)
  1. В libstdc++, shrink_to_fit() недоступен в режиме C++98.

Содержание

Параметры шаблона

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

Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента удовлетворял требованиям Erasable , но многие функции-члены накладывают более строгие требования. Этот контейнер (но не его члены) может быть инстанцирован с неполным типом элемента, если аллокатор удовлетворяет требованиям полноты аллокатора .

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_incomplete_container_elements 201505L (C++17) Минимальная поддержка неполных типов
(с 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 и LegacyContiguousIterator для value_type

(до C++20)

LegacyRandomAccessIterator , contiguous_iterator , и ConstexprIterator для value_type

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

LegacyRandomAccessIterator и LegacyContiguousIterator для const value_type

(до C++20)

LegacyRandomAccessIterator , contiguous_iterator , и ConstexprIterator для const value_type

(начиная с C++20)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

Функции-члены

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

Функции, не являющиеся членами класса

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

Руководства по выводу

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

Примечания

Feature-test макрос Значение Стандарт Функциональность
__cpp_lib_containers_ranges 202202L (C++23) Конструкция и вставка диапазонов для контейнеров
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range , ranges::reserve_hint и изменения в std::vector

Пример

#include <iostream>
#include <vector>
int main()
{
    // Создаем вектор, содержащий целые числа
    std::vector<int> v = {8, 4, 5, 9};
    // Добавляем еще два целых числа в вектор
    v.push_back(6);
    v.push_back(9);
    // Перезаписываем элемент в позиции 2
    v[2] = -1;
    // Выводим вектор
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Вывод:

8 4 -1 9 6 9

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 69 C++98 непрерывность хранения элементов vector не требовалась требуется
LWG 230 C++98 T не требовалось быть CopyConstructible
(элемент типа T мог быть неконструируемым)
T также требуется
быть CopyConstructible
LWG 464 C++98 доступ к базовому хранилищу пустого vector приводил к неопределённому поведению предоставлена функция data

Смотрите также

изменяемый массив фиксированной ёмкости с размещением на месте
(шаблон класса)
(C++11)
массив фиксированного размера с размещением на месте
(шаблон класса)
двусторонняя очередь
(шаблон класса)