Namespaces
Variants

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

Из ru.cppreference.net
 
 
 
 
vector() : vector(Allocator()) {}
(1) (начиная с C++11)
(до C++17)
vector() noexcept(noexcept(Allocator())) : vector(Allocator()) {}
(начиная с C++17)
(constexpr начиная с C++20)
explicit vector( const Allocator& alloc = Allocator() );
(2) (до C++11)
explicit vector( const Allocator& alloc );
(начиная с C++11)
(noexcept начиная с C++17)
(constexpr начиная с C++20)
explicit vector( size_type count,
                 const Allocator& alloc = Allocator() );
(3) (начиная с C++11)
explicit vector( size_type count, const T& value = T(),
                 const Allocator& alloc = Allocator() );
(4) (до C++11)
vector( size_type count, const T& value,
        const Allocator& alloc = Allocator() );
(начиная с C++11)
(constexpr начиная с C++20)
template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );
(5) (constexpr начиная с C++20)
template< container-compatible-range<T> R >
constexpr vector( std::from_range_t, R&& rg,
                  const Allocator& alloc = Allocator() );
(6) (начиная с C++23)
vector( const vector& other );
(7) (constexpr начиная с C++20)
vector( vector&& other );
(8) (начиная с C++11)
(noexcept начиная с C++17)
(constexpr начиная с C++20)
vector( const vector& other, const Allocator& alloc );
(9) (начиная с C++11)
(constexpr начиная с C++20)
(до C++23)
constexpr vector( const vector& other,
                  const std::type_identity_t<Allocator>& alloc );
(начиная с C++23)
vector( vector&& other, const Allocator& alloc );
(10) (начиная с C++11)
(constexpr начиная с C++20)
(до C++23)
constexpr vector( vector&& other,
                  const std::type_identity_t<Allocator>& alloc );
(начиная с C++23)
vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
(11) (начиная с C++11)

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

1) Конструктор по умолчанию начиная с C++11. Создаёт пустой vector с распределителем, созданным по умолчанию.
Если Allocator не является DefaultConstructible, поведение не определено.
2) Конструктор по умолчанию до C++11. Создаёт пустой vector с заданным распределителем alloc.
3) Создаёт vector с count объектами, вставленными по умолчанию, типа T. Копирования не производится.
Если T не является DefaultInsertable в std::vector<T>, поведение не определено.
4) Создаёт vector с count копиями элементов со значением value.

Если T не является CopyInsertable в std::vector<T>, поведение не определено.

(начиная с C++11)
5) Создаёт vector с содержимым диапазона [first, last). Каждый итератор из [first, last) разыменовывается ровно один раз.

Если InputIt не удовлетворяет требованиям LegacyInputIterator, то вызывается перегрузка (4) с аргументами static_cast<size_type>(first), last и alloc.

(до C++11)

Эта перегрузка участвует в разрешении перегрузки, только если InputIt удовлетворяет требованиям LegacyInputIterator.

Если выполняется любое из следующих условий, поведение не определено:

(начиная с C++11)
6) Создаёт vector с содержимым диапазона rg. Каждый итератор из rg разыменовывается ровно один раз.
Если выполняется любое из следующих условий, поведение не определено:
7-10) Создаёт vector с содержимым other.
7) Конструктор копирования.

Распределитель получается как если бы вызовом std::allocator_traits<Allocator>::select_on_container_copy_construction(alloc), где alloc является распределителем other.

(начиная с C++11)
8) Конструктор перемещения. Распределитель получается перемещающим конструированием из other.get_allocator().
9) То же, что и конструктор копирования, за исключением того, что alloc используется как распределитель.
Если T не является CopyInsertable в std::vector<T>, поведение не определено.
10) То же, что и конструктор перемещения, за исключением того, что alloc используется как распределитель.
Если T не является MoveInsertable в std::vector<T>, поведение не определено.
11) Эквивалентен vector(il.begin(), il.end(), alloc).

Параметры

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

Сложность

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

Исключения

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

Примечания

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

Проверка возможности макрос Значение Стандарт Возможность
__cpp_lib_containers_ranges 202202L (C++23) Осведомлённая о диапазонах конструкция и вставка; перегрузка (6)

Пример

#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:
    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;
    const auto rg = {"cat", "cow", "crow"};
#ifdef __cpp_lib_containers_ranges
    std::vector<std::string> words5(std::from_range, rg); // перегрузка (6)
#else
    std::vector<std::string> words5(rg.begin(), rg.end()); // перегрузка (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 438 C++98 перегрузка ( 5 ) вызывала перегрузку ( 4 )
только если InputIt является целочисленным типом
вызывает перегрузку ( 4 ) если InputIt
не является LegacyInputIterator
LWG 2193 C++11 конструктор по умолчанию был explicit сделан не-explicit
LWG 2210 C++11 перегрузка ( 3 ) не имела параметра аллокатора параметр добавлен
N3346 C++11 для перегрузки ( 3 ) , элементы в
контейнере были value-initialized
они default-inserted

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

присваивает значения контейнеру
(public member function)
присваивает значения контейнеру
(public member function)