Namespaces
Variants

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

From cppreference.net

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) 使用 cont 的内容复制构造底层容器 c 这也是默认构造函数。 (until C++11)
3) 移动构造底层容器 c std :: move ( cont )
4) 复制构造函数 。该适配器通过复制 other. c 的内容进行构造。
5) 移动构造函数 。适配器通过 std :: move ( other. c ) 构造。
6) 使用范围 [ first , last ) 的内容构造底层容器 c 。此重载仅当 InputIt 满足 LegacyInputIterator 时参与重载决议。
7-12) 这些构造函数仅在 std:: uses_allocator < Container, Alloc > :: value true 时参与重载决议,即仅当底层容器是分配器感知容器时(对于所有可与 stack 配合使用的标准库容器均为真)。
7) 使用 alloc 作为分配器构造底层容器,如同通过 c ( alloc ) 实现。
8) 使用 alloc 作为分配器,以 cont 的内容构造底层容器,如同通过 c ( cont, alloc ) 实现。
9) 使用移动语义构造底层容器,以 alloc 作为分配器,内容为 cont 的内容,如同通过 c ( std :: move ( cont ) , alloc ) 实现。
10) 构造适配器,以 other. c 的内容并使用 alloc 作为分配器,如同通过 c ( other. c , alloc ) 实现。
11) 使用移动语义构造适配器,以 alloc 作为分配器,包含 other 的内容,如同通过 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 - 容器兼容范围 ,即元素可转换为 T input_range
类型要求
-
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++标准。

缺陷报告 适用范围 发布时的行为 正确行为
P0935R0 C++11 默认构造函数为显式 改为隐式

另请参阅

为容器适配器赋值
(公开成员函数)