std::vector<T,Allocator>:: vector
| (1) | ||
|
vector
(
)
:
vector
(
Allocator
(
)
)
{
}
|
(начиная с C++11)
(до C++17) |
|
|
vector
(
)
noexcept
(
noexcept
(
Allocator
(
)
)
)
:
vector
(
Allocator
(
)
)
{
}
|
(начиная с C++17)
(constexpr начиная с C++20) |
|
| (2) | ||
|
explicit
vector
(
const
Allocator
&
alloc
=
Allocator
(
)
)
;
|
(до 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) |
| (4) | ||
|
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)
(constexpr начиная с C++20) |
|
|
template
<
class
InputIt
>
vector
(
InputIt first, InputIt last,
|
(5) | (constexpr начиная с C++20) |
|
template
<
container-compatible-range
<
T
>
R
>
constexpr
vector
(
std::
from_range_t
, R
&&
rg,
|
(6) | (начиная с C++23) |
|
vector
(
const
vector
&
other
)
;
|
(7) | (constexpr начиная с C++20) |
|
vector
(
vector
&&
other
)
;
|
(8) |
(начиная с C++11)
(noexcept начиная с C++17) (constexpr начиная с C++20) |
| (9) | ||
|
vector
(
const
vector
&
other,
const
Allocator
&
alloc
)
;
|
(начиная с C++11)
(constexpr начиная с C++20) (до C++23) |
|
|
constexpr
vector
(
const
vector
&
other,
const std:: type_identity_t < Allocator > & alloc ) ; |
(начиная с C++23) | |
| (10) | ||
|
vector
(
vector
&&
other,
const
Allocator
&
alloc
)
;
|
(начиная с C++11)
(до 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
с аллокатором, созданным конструктором по умолчанию.
vector
с заданным аллокатором
alloc
.
vector
с
count
объектами типа
T
, вставленными по умолчанию. Копирование не производится.
vector
с
count
копиями элементов со значением
value
.
|
Если
|
(since C++11) |
vector
с содержимым диапазона
[
first
,
last
)
. Каждый итератор в
[
first
,
last
)
разыменовывается ровно один раз.
|
Если
|
(до C++11) |
|
Эта перегрузка участвует в разрешении перегрузки только если
Если удовлетворяется любое из следующих условий, поведение не определено:
|
(начиная с C++11) |
vector
с содержимым диапазона
rg
. Каждый итератор в
rg
разыменовывается ровно один раз.
-
Tне является EmplaceConstructible вvectorиз * ranges:: begin ( rg ) . -
Rне моделирует ниsized_range, ниforward_range, иTне является MoveInsertable вvector.
vector
с содержимым
other
.
|
Аллокатор получается как если бы вызывался
|
(since C++11) |
vector
с содержимым
other
. Аллокатор получается путем перемещения из
other.
get_allocator
(
)
.
Содержание |
Параметры
| alloc | - | аллокатор для использования во всех выделениях памяти этого контейнера |
| count | - | размер контейнера |
| value | - | значение для инициализации элементов контейнера |
| first, last | - | пара итераторов, определяющая диапазон элементов для копирования |
| other | - | другой контейнер, используемый в качестве источника для инициализации элементов контейнера |
| init | - | список инициализации для инициализации элементов контейнера |
| rg | - | диапазон, совместимый с контейнером |
Сложность
-
Если
InputItудовлетворяет требованиям LegacyForwardIterator , тогда:
-
-
Конструктор копирования
Tвызывается только N раз. - Перераспределение памяти не происходит.
-
Конструктор копирования
- В противном случае:
-
-
Конструктор копирования
Tвызывается O(N) раз. - Перераспределение памяти происходит O(log N) раз.
-
Конструктор копирования
|
(до C++26) |
|
(начиная с C++26) |
-
- Инициализирует ровно N элементов из результата разыменования последовательных итераторов rg .
- Перераспределение памяти не происходит.
- В противном случае:
-
-
Конструктор копирования или перемещения
Tвызывается O(N) раз. - Перераспределение памяти происходит O(log N) раз.
-
Конструктор копирования или перемещения
Исключения
Вызовы Allocator :: allocate могут генерировать исключения.
Примечания
После перемещающего конструирования контейнера (перегрузка ( 8 ) ), ссылки, указатели и итераторы (кроме конечного итератора) на other остаются действительными, но ссылаются на элементы, которые теперь находятся в * this . Текущий стандарт обеспечивает эту гарантию с помощью общего положения в [container.reqmts]/67 , и более прямая гарантия рассматривается через LWG issue 2321 .
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Диапазонно-ориентированное создание и вставка; перегрузка ( 6 ) |
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range и ranges::reserve_hint ; перегрузка ( 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) |