Namespaces
Variants

std::stack<T,Container>:: stack

From cppreference.net

(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
stack ( ) : stack ( Container ( ) ) { }
(1) (начиная с C++11)
(2)
explicit stack ( const Container & cont = Container ( ) ) ;
(до C++11)
explicit stack ( const Container & cont ) ;
(начиная с C++11)
explicit stack ( Container && cont ) ;
(3) (начиная с C++11)
stack ( const stack & other ) ;
(4) (неявно объявлен)
stack ( stack && other ) ;
(5) (начиная с C++11)
(неявно объявлен)
template < class InputIt >
stack ( InputIt first, InputIt last ) ;
(6) (начиная с C++23)
template < class Alloc >
explicit stack ( const Alloc & alloc ) ;
(7) (начиная с C++11)
template < class Alloc >
stack ( const Container & cont, const Alloc & alloc ) ;
(8) (начиная с C++11)
template < class Alloc >
stack ( Container && cont, const Alloc & alloc ) ;
(9) (начиная с C++11)
template < class Alloc >
stack ( const stack & other, const Alloc & alloc ) ;
(10) (начиная с C++11)
template < class Alloc >
stack ( stack && other, const Alloc & alloc ) ;
(11) (начиная с C++11)
template < class InputIt, class Alloc >
stack ( InputIt first, InputIt last, const Alloc & alloc ) ;
(12) (начиная с C++23)
template < container-compatible-range < T > R >
stack ( std:: from_range_t , R && rg ) ;
(13) (начиная с C++23)
template < container-compatible-range < T > R, class Alloc >
stack ( std:: from_range_t , R && rg, const Alloc & alloc ) ;
(14) (начиная с C++23)

Создает новый базовый контейнер адаптера контейнера из различных источников данных.

1) Конструктор по умолчанию. Выполняет инициализацию значениями контейнера.
2) Копирует базовый контейнер c с содержимым cont . Это также конструктор по умолчанию. (до C++11)
3) Перемещающий конструктор базового контейнера c с std :: move ( cont ) .
4) Конструктор копирования . Адаптер копируется с содержимым other. c .
5) Move constructor . Адаптер создается с помощью std :: move ( other. c ) .
6) Конструирует базовый контейнер c с содержимым диапазона [ first , last ) . Эта перегрузка участвует в разрешении перегрузки только если InputIt удовлетворяет требованиям LegacyInputIterator .
7-12) Эти конструкторы участвуют в разрешении перегрузки только если std:: uses_allocator < Container, Alloc > :: value равно true , то есть если нижележащий контейнер является контейнером с поддержкой аллокатора (верно для всех контейнеров стандартной библиотеки, которые могут использоваться с stack ).
7) Создает базовый контейнер, используя alloc в качестве аллокатора, как если бы с помощью c ( alloc ) .
8) Создает базовый контейнер с содержимым cont и использует alloc в качестве аллокатора, как если бы было вызвано c ( cont, alloc ) .
9) Конструирует базовый контейнер с содержимым cont с использованием семантики перемещения, используя alloc в качестве аллокатора, как если бы c ( std :: move ( cont ) , alloc ) .
10) Конструирует адаптер с содержимым other. c и используя alloc в качестве аллокатора, как если бы c ( other. c , alloc ) .
11) Конструирует адаптер с содержимым other используя семантику перемещения с применением alloc в качестве аллокатора, как если бы c ( std :: move ( other. c ) , alloc ) .
12) Создает базовый контейнер с содержимым диапазона [ first , last ) используя alloc в качестве аллокатора, как если бы вызывалось c ( first, last, alloc ) . Эта перегрузка участвует в разрешении перегрузки только если InputIt удовлетворяет требованиям LegacyInputIterator .
13) Создает базовый контейнер с помощью ranges:: to < Container > ( std:: forward < R > ( rg ) ) .
14) Создает базовый контейнер с помощью ranges:: to < Container > ( std:: forward < R > ( rg ) , alloc ) .

Содержание

Параметры

alloc - аллокатор, используемый для всех выделений памяти базового контейнера
other - другой адаптер контейнера, используемый в качестве источника для инициализации базового контейнера
cont - контейнер, используемый в качестве источника для инициализации базового контейнера
first, last - пара итераторов, определяющая исходный диапазон элементов для инициализации
rg - контейнерно-совместимый диапазон , то есть input_range , элементы которого конвертируются в T
Требования к типам
-
Alloc должен соответствовать требованиям Allocator .
-
Container должен соответствовать требованиям Container . Конструкторы, принимающие параметр аллокатора, участвуют в разрешении перегрузки только если Container соответствует требованиям AllocatorAwareContainer .
-
InputIt должен соответствовать требованиям LegacyInputIterator .

Сложность

То же, что и соответствующая операция для обёрнутого контейнера.

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_adaptor_iterator_pair_constructor 202106L (C++23) Конструкторы с парой итераторов для std::queue и std::stack ; перегрузки ( 6 ) и ( 12 )
__cpp_lib_containers_ranges 202202L (C++23) Ориентированные на диапазоны конструкция и вставка; перегрузки ( 13 ) и ( 14 )

Пример

#include <cassert>
#include <deque>
#include <iostream>
#include <memory>
#include <ranges>
#include <stack>
int main()
{
    std::stack<int> c1;
    c1.push(5);
    assert(c1.size() == 1);
    std::stack<int> c2(c1);
    assert(c2.size() == 1);
    std::deque<int> deq{3, 1, 4, 1, 5};
    std::stack<int> c3(deq); // перегрузка (2)
    assert(c3.size() == 5);
# ifdef __cpp_lib_adaptor_iterator_pair_constructor
    const auto il = {2, 7, 1, 8, 2};
    std::stack<int> c4{il.begin(), il.end()}; // C++23, (6)
    assert(c4.size() == 5);
# endif
# if __cpp_lib_containers_ranges >= 202202L
    // C++23, перегрузка (13)
    auto c5 = std::stack(std::from_range_t, std::ranges::iota(0, 42));
    assert(c5.size() == 42);
    // тот же эффект с использованием синтаксиса конвейера, внутренне использует перегрузку (13)
    auto c6 = std::ranges::iota(0, 42) | std::ranges::to<std::stack>();
    assert(c6.size() == 42);
    std::allocator<int> alloc;
    // C++23, перегрузка (14)
    auto c7 = std::stack(std::from_range_t, std::ranges::iota(0, 42), alloc);
    assert(c7.size() == 42);
    // тот же эффект с использованием синтаксиса конвейера, внутренне использует перегрузку (14)
    auto c8 = std::ranges::iota(0, 42) | std::ranges::to<std::stack>(alloc);
    assert(c8.size() == 42);
# endif
}

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P0935R0 C++11 default constructor was explicit made implicit

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

присваивает значения адаптеру контейнера
(публичная функция-член)