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.
vector с распределителем памяти, сконструированным по умолчанию.Allocator не является DefaultConstructible, поведение не определено.vector с заданным распределителем памяти alloc.vector с count объектами типа T, вставленными по умолчанию. Копии не создаются.vector с count копиями элементов со значением value. | Если | (начиная с C++11) |
vector с содержимым диапазона [first, last). Каждый итератор в [first, last) разыменовывается ровно один раз. | Если | (до C++11) |
| Эта перегрузка участвует в разрешении перегрузки, только если Если выполняется любое из следующих условий, поведение не определено:
| (начиная с C++11) |
vector с содержимым диапазона rg. Каждый итератор в rg разыменовывается ровно один раз.-
Tне является EmplaceConstructible в std::vector<T> из*ranges::begin(rg). -
Rмоделирует ниsized_range, ниforward_range, аTне является MoveInsertable в std::vector<T>.
vector с содержимым other.| Распределитель памяти получается так, как если бы был вызван | (начиная с C++11) |
other.get_allocator().alloc.alloc.vector(il.begin(), il.end(), alloc).Параметры
| alloc | - | распределитель памяти, используемый для всех выделений памяти этого контейнера |
| count | - | размер контейнера |
| value | - | значение, которым инициализируются элементы контейнера |
| first, last | - | пара итераторов, задающих диапазон элементов, из которых копируются элементы |
| other | - | другой контейнер, используемый в качестве источника для инициализации элементов контейнера |
| init | - | список инициализации для инициализации элементов контейнера |
| rg | - | диапазон, совместимый с контейнером |
Сложность
count.std::distance(first, last) через N: - Если
firstиlastявляются прямыми, двунаправленными или итераторами произвольного доступа, - Конструктор копирования
Tвызывается только N раз, и - Перевыделение памяти не происходит.
- В противном случае (
firstиlastявляются только входными итераторами), - Конструктор копирования
Tвызывается O(N) раз, и - Перевыделение памяти происходит O(log N) раз.
ranges::distance(rg) через N: - Если
Rмоделируетranges::forward_rangeилиranges::sized_range, - Ровно N элементов инициализируются результатами разыменования последовательных итераторов
rg, и - Перевыделение памяти не происходит.
- В противном случае (
Rмоделирует входной диапазон), - Конструктор копирования или перемещения
Tвызывается O(N) раз, и - Перевыделение памяти происходит O(log N) раз.
other.size().other.size().other.size(), если alloc != other.get_allocator(), иначе константная.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) элементы контейнера инициализировались значением | они вставляются по умолчанию |
См. также
| присваивает значения контейнеру (открытая функция-член) |
|
| присваивает значения контейнеру (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/vector/vector