Namespaces
Variants

std::deque<T,Allocator>:: deque

From cppreference.net
deque ( ) : deque ( Allocator ( ) ) { }
(1) (начиная с C++11)
(constexpr начиная с C++26)
(2)
explicit deque ( const Allocator & alloc = Allocator ( ) ) ;
(до C++11)
explicit deque ( const Allocator & alloc ) ;
(начиная с C++11)
(constexpr начиная с C++26)
explicit deque ( size_type count,
const Allocator & alloc = Allocator ( ) ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)
(4)
explicit deque ( size_type count, const T & value = T ( ) ,
const Allocator & alloc = Allocator ( ) ) ;
(до C++11)
deque ( size_type count, const T & value,
const Allocator & alloc = Allocator ( ) ) ;
(начиная с C++11)
(constexpr начиная с C++26)
template < class InputIt >

deque ( InputIt first, InputIt last,

const Allocator & alloc = Allocator ( ) ) ;
(5) (constexpr начиная с C++26)
template < container-compatible-range < T > R >

deque ( std:: from_range_t , R && rg,

const Allocator & alloc = Allocator ( ) ) ;
(6) (начиная с C++23)
(constexpr начиная с C++26)
deque ( const deque & other ) ;
(7) (constexpr начиная с C++26)
deque ( deque && other ) ;
(8) (начиная с C++11)
(constexpr начиная с C++26)
(9)
deque ( const deque & other, const Allocator & alloc ) ;
(начиная с C++11)
(до C++23)
deque ( const deque & other,
const std:: type_identity_t < Allocator > & alloc ) ;
(начиная с C++23)
(constexpr начиная с C++26)
(10)
deque ( deque && other, const Allocator & alloc ) ;
(начиная с C++11)
(до C++23)
deque ( deque && other, const std:: type_identity_t < Allocator > & alloc ) ;
(начиная с C++23)
(constexpr начиная с C++26)
deque ( std:: initializer_list < T > init,
const Allocator & alloc = Allocator ( ) ) ;
(11) (начиная с C++11)
(constexpr начиная с C++26)

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

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

Если T не является CopyInsertable в deque , поведение не определено.

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

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

(до C++11)

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

Если T не является EmplaceConstructible в deque из * first , поведение не определено.

(начиная с C++11)
6) Создает deque с содержимым диапазона rg . Каждый итератор в rg разыменовывается ровно один раз.
Если T не является EmplaceConstructible в deque из * ranges:: begin ( rg ) , поведение не определено.
7) Конструктор копирования. Создает deque с содержимым other .

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

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

Содержание

Параметры

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

Сложность

1,2) Константа.
3,4) Линейно по count .
5) Линейная по std:: distance ( first, last ) .
6) Линейная по ranges:: distance ( rg ) .
7) Линейно от other. size ( ) .
8) Константа.
9) Линейно от other. size ( ) .
10) Линейная по other. size ( ) если alloc ! = other. get_allocator ( ) , иначе константная.
11) Линейная от init. size ( ) .

Исключения

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

Примечания

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

Feature-test макрос Значение Стандарт Функциональность
__cpp_lib_containers_ranges 202202L (C++23) Ranges-aware конструирование и вставка; перегрузка ( 6 )

Пример

#include <deque>
#include <iostream>
#include <string>
template<typename T>
std::ostream& operator<<(std::ostream& s, const std::deque<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::deque<std::string> words1{"the", "frogurt", "is", "also", "cursed"};
    std::cout << "1: " << words1;
    // words2 == words1
    std::deque<std::string> words2(words1.begin(), words1.end());
    std::cout << "2: " << words2;
    // words3 == words1
    std::deque<std::string> words3(words1);
    std::cout << "3: " << words3;
    // words4 is {"Mo", "Mo", "Mo", "Mo", "Mo"}
    std::deque<std::string> words4(5, "Mo");
    std::cout << "4: " << words4;
    const auto rg = {"cat", "cow", "crow"};
#ifdef __cpp_lib_containers_ranges
    std::deque<std::string> words5(std::from_range, rg); // перегрузка (6)
#else
    std::deque<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 144 C++98 требование сложности для перегрузки ( 5 ) было таким же
как у соответствующей перегрузки std::vector
изменено на линейную сложность
LWG 237 C++98 требование сложности для перегрузки
( 5 ) было линейным по first - last
изменено на линейное по
std:: distance ( first, last )
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)