Spec-Zone.ru › C++

std::vector<T,Allocator>::vector

(1)
vector();
(до C++17)
vector() noexcept(noexcept(Allocator()));
(с C++17)
(до C++20)
constexpr vector() noexcept(noexcept(Allocator()));
(с C++20)
(2)
explicit vector( const Allocator& alloc );
(до C++17)
explicit vector( const Allocator& alloc ) noexcept;
(с C++17)
(до C++20)
constexpr explicit vector( const Allocator& alloc ) noexcept;
(с C++20)
(3)
explicit vector( size_type count,
                 const T& value = T(),
                 const Allocator& alloc = Allocator() );
(до C++11)
vector( size_type count,
                 const T& value,
                 const Allocator& alloc = Allocator() );
(с C++11)
(до C++20)
constexpr vector( size_type count,
                  const T& value,
                  const Allocator& alloc = Allocator() );
(с C++20)
(4)
explicit vector( size_type count );
(с C++11)
(до C++14)
explicit vector( size_type count,
                 const Allocator& alloc = Allocator() );
(с C++14)
(до C++20)
constexpr explicit vector( size_type count,
                           const Allocator& alloc = Allocator() );
(с C++20)
(5)
template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );
(до C++20)
template< class InputIt >
constexpr vector( InputIt first, InputIt last,
                  const Allocator& alloc = Allocator() );
(с C++20)
(6)
vector( const vector& other );
(до C++20)
constexpr vector( const vector& other );
(с C++20)
(7)
vector( const vector& other, const Allocator& alloc );
(с C++11)
(до C++20)
constexpr vector( const vector& other, const Allocator& alloc );
(с C++20)
(8)
vector( vector&& other );
(с C++11)
(до C++17)
vector( vector&& other ) noexcept;
(с C++17)
(до C++20)
constexpr vector( vector&& other ) noexcept;
(с C++20)
(9)
vector( vector&& other, const Allocator& alloc );
(с C++11)
(до C++20)
constexpr vector( vector&& other, const Allocator& alloc );
(с C++20)
(10)
vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
(с C++11)
(до C++20)
constexpr vector( std::initializer_list<T> init,
                  const Allocator& alloc = Allocator() );
(с C++20)
template< container-compatible-range<T> R >
constexpr vector( std::from_range_t, R&& rg,
                  const Allocator& alloc = Allocator() );
(11) (с C++23)

Создаёт новый контейнер из различных источников данных, необязательно используя предоставленный пользователем аллокатор alloc.

1) Конструктор по умолчанию. Создаёт пустой контейнер с аллокатором, сконструированным по умолчанию.
2) Создаёт пустой контейнер с заданным аллокатором alloc.
3) Создаёт контейнер с count копиями элементов со значением value.
4) Создаёт контейнер с count элементами по умолчанию типа T. Копирование не выполняется.
5) Создаёт контейнер со содержимым диапазона [first, last).

Этот конструктор имеет тот же эффект, что и vector(static_cast<size_type>(first), static_cast<value_type>(last), a) если InputIt является целым типом.

(до C++11)

Эта перегрузка участвует в разрешении перегрузки только если InputIt удовлетворяет LegacyInputIterator, чтобы избежать неоднозначности с перегрузкой (3).

(с C++11)
6) Конструктор копирования. Создаёт контейнер с копией содержимого other.

Аллокатор получается как если бы вызывали std::allocator_traits<allocator_type>::select_on_container_copy_construction(
other.get_allocator())
.

(с C++11)
7) Создаёт контейнер с копией содержимого other, используя alloc в качестве аллокатора.

Во время вывода шаблона аргументов класса, только первый аргумент вносит вклад в вывод шаблона параметра Allocator контейнера.

(с C++23)
8) Конструктор перемещения. Создаёт контейнер с содержимым other с использованием семантики перемещения. Аллокатор получается путём перемещения из аллокатора, принадлежащего other. После перемещения other гарантированно является empty().
9) Расширенный конструктор перемещения с аллокатором. Используя alloc в качестве аллокатора для нового контейнера, перемещая содержимое из other; если alloc != other.get_allocator(), это приводит к перемещению элементов по отдельности. (В этом случае other не гарантируется пустым после перемещения.)

Во время вывода шаблона аргументов класса, только первый аргумент вносит вклад в вывод шаблона параметра Allocator контейнера.

(с C++23)
10) Создаёт контейнер с содержимым списком инициализаторов init.
11) Создаёт контейнер с содержимым диапазона rg.

Параметры

alloc - аллокатор, используемый для всех выделений памяти этого контейнера
count - размер контейнера
value - значение, с которым инициализируются элементы контейнера
first, last - диапазон [first, last) для копирования элементов из
other - другой контейнер, используемый в качестве источника для инициализации элементов контейнера
init - список инициализаторов для инициализации элементов контейнера
rg - совместимый с контейнером диапазон, то есть input_range, элементы которого можно преобразовать в T

Сложность

1,2) Постоянная.
3,4) Линейная по count.
5) Учитывая расстояние между first и last как N,
  • Если first и last являются итераторами вперёд, в обе стороны или произвольного доступа,
    • Конструктор копирования T вызывается только N раз, и
    • Перераспределение не происходит.
  • В противном случае (first и last — итераторы только для чтения),
    • Конструктор копирования T вызывается O(N) раз, и
    • Перераспределение происходит O(log N) раз.
6,7) Линейная по размеру other.
8) Постоянная.
9) Линейный, если alloc != other.get_allocator(), в противном случае постоянный.
10) Линейный по размеру init.
11) Дано ranges::distance(rg) как N,
  • Если R моделирует ranges::forward_range или ranges::sized_range,
    • Инициализирует ровно N элементов из результата деференцирования последовательных итераторов rg, и
    • Перераспределение не происходит.
  • В противном случае (R моделирует диапазон входных данных),
    • Копирующий или перемещающий конструктор T вызывается O(N) раз, и
    • Перераспределение происходит O(log N) раз.

Исключения

Вызовы Allocator::allocate могут вызывать исключения.

Примечания

После перемещения контейнера (перегрузка (8)), ссылки, указатели и итераторы (кроме итератора конца) на other остаются действительными, но ссылаются на элементы, которые теперь находятся в *this. Текущий стандарт гарантирует это через общее утверждение в [container.reqmts]/67, и более прямое гарантирование рассматривается в LWG issue 2321.

Перегрузка (4) обнуляет элементы неклассовых типов, таких как int, что отличается от поведения new[], которое оставляет их неинициализированными. Для соответствия поведению new[] может быть предоставлен настраиваемый Allocator::construct, который оставляет такие элементы неинициализированными.

Обратите внимание, что наличие конструктора по списковой инициализации (10) означает, что инициализация списком и прямая инициализация делают разные вещи:

std::vector<int> b{3}; // creates a 1-element vector holding {3}
std::vector<int> d(3); // creates a 3-element vector holding {0, 0, 0}
 
std::vector<int> p{1, 2}; // creates a 2-element vector holding {1, 2}
std::vector<int> q(1, 2); // creates a 1-element vector holding {2}
Макросы проверки наличия функции Значение Std Функция
__cpp_lib_containers_ranges 202202L (C++23) Совместимая с диапазонами конструкция и вставка; перегрузка (11)

Пример

#include <iostream>
#include <string>
#include <vector>
 
template<typename T>
std::ostream& operator<<(std::ostream& s, const std::vector<T>& v)
{
    s.put('{');
    for (char comma[]{'\0', ' ', '\0'}; const auto& e : v)
        s << comma << e, comma[0] = ',';
    return s << "}\n";
}
 
int main()
{
    // C++11 initializer list syntax:
    std::vector<std::string> words1{"the", "frogurt", "is", "also", "cursed"};
    std::cout << "1: " << words1;
 
    // words2 == words1
    std::vector<std::string> words2(words1.begin(), words1.end());
    std::cout << "2: " << words2;
 
    // words3 == words1
    std::vector<std::string> words3(words1);
    std::cout << "3: " << words3;
 
    // words4 is {"Mo", "Mo", "Mo", "Mo", "Mo"}
    std::vector<std::string> words4(5, "Mo");
    std::cout << "4: " << words4;
 
    auto const rg = {"cat", "cow", "crow"};
#ifdef __cpp_lib_containers_ranges
    std::vector<std::string> words5(std::from_range, rg); // overload (11)
#else
    std::vector<std::string> words5(rg.begin(), rg.end()); // overload (5)
#endif
    std::cout << "5: " << words5;
}

Вывод:

1: {the, frogurt, is, also, cursed}
2: {the, frogurt, is, also, cursed}
3: {the, frogurt, is, also, cursed}
4: {Mo, Mo, Mo, Mo, Mo}
5: {cat, cow, crow}

Отчёты об ошибках

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

DR Применено к Поведение при публикации Корректное поведение
LWG 134 C++98 перегрузка (5) допускала до 2N  вызовов копирующего конструктора в случае итератора входного диапазона изменено на O(N) вызовов
LWG 868 C++98 для перегрузки (4), элементы в контейнере инициализировались по умолчанию они инициализируются со значением
LWG 2193 C++11 конструктор по умолчанию был явным сделано неявным

См. также

assign
присваивает значения контейнеру
(общедоступный член-функция)
operator=
присваивает значения контейнеру
(общедоступный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/vector/vector

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API