Spec-Zone.ru › C++

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

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.

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

  • T не является EmplaceConstructible в std::vector<T> из *first.
  • Iter не удовлетворяет требованиям LegacyForwardIterator, а T не является MoveInsertable в std::vector<T>.
(начиная с C++11)
6) Создаёт vector с содержимым диапазона rg. Каждый итератор в rg разыменовывается ровно один раз.
Если выполняется любое из следующих условий, поведение не определено:
  • T не является EmplaceConstructible в std::vector<T> из *ranges::begin(rg).
  • R моделирует ни sized_range, ни forward_range, а T не является MoveInsertable в std::vector<T>.
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:
  • Если first и last являются прямыми, двунаправленными или итераторами произвольного доступа,
    • Конструктор копирования T вызывается только N раз, и
    • Перевыделение памяти не происходит.
  • В противном случае (first и last являются только входными итераторами),
    • Конструктор копирования T вызывается O(N) раз, и
    • Перевыделение памяти происходит O(log N) раз.
6) Обозначим ranges::distance(rg) через N:
  • Если R моделирует ranges::forward_range или ranges::sized_range,
    • Ровно N элементов инициализируются результатами разыменования последовательных итераторов rg, и
    • Перевыделение памяти не происходит.
  • В противном случае (R моделирует входной диапазон),
    • Конструктор копирования или перемещения 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 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 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;
    
    const auto rg = {"cat", "cow", "crow"};
#ifdef __cpp_lib_containers_ranges
    std::vector<std::string> words5(std::from_range, rg); // overload (6)
#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 438 C++98 перегрузка (5) вызывала перегрузку (4)
только если InputIt является целочисленным типом
вызывает перегрузку (4), если InputIt
не является LegacyInputIterator
LWG 2193 C++11 конструктор по умолчанию был явным сделан неявным
LWG 2210 C++11 перегрузка (3) не имела параметра распределителя памяти параметр добавлен
N3346 C++11 для перегрузки (3) элементы контейнера
инициализировались значением
они вставляются по умолчанию

См. также

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

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

Spec-Zone.ru

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