<stack>
头文件中。template <class T, class Container = deque<T> > class stack;可以看到 template 的第二个参数 Container 默认指定的是 deque。除了 deque 之外,stack 的底层还可以指定用 vector 和 list 容器实现。
std::stack<int> values;上面这行代码,就成功创建了一个可存储 int 类型元素,底层采用 deque 基础容器的 stack 适配器。
std::stack<std::string, std::list<int>> values;
std::list<int> values {1, 2, 3}; std::stack<int,std::list<int>> my_stack (values);注意,初始化后的 my_stack 适配器中,栈顶元素为 3,而不是 1。另外在第 2 行代码中,stack 第 2 个模板参数必须显式指定为 list<int>(必须为 int 类型,和存储类型保持一致),否则 stack 底层将默认使用 deque 容器,也就无法用 lsit 容器的内容来初始化 stack 适配器。
std::list<int> values{ 1, 2, 3 }; std::stack<int, std::list<int>> my_stack1(values); std::stack<int, std::list<int>> my_stack=my_stack1; //std::stack<int, std::list<int>> my_stack(my_stack1);可以看到,和使用基础容器不同,使用 stack 适配器给另一个 stack 进行初始化时,有 2 种方式,使用哪一种都可以。
成员函数 | 功能 |
---|---|
empty() | 当 stack 栈中没有元素时,该成员函数返回 true;反之,返回 false。 |
size() | 返回 stack 栈中存储元素的个数。 |
top() | 返回一个栈顶元素的引用,类型为 T&。如果栈为空,程序会报错。 |
push(const T& val) | 先复制 val,再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。 |
push(T&& obj) | 以移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。 |
pop() | 弹出栈顶元素。 |
emplace(arg...) | arg... 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。 |
swap(stack<T> & other_stack) | 将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
#include <iostream> #include <stack> int main() { std::stack<int> s; s.push(1); // 添加元素 s.push(2); s.push(3); int x = s.top(); // 访问顶部元素(不删除) std::cout << x << std::endl; // 输出3 s.pop(); // 删除顶部元素 bool isEmpty = s.empty(); // 检查stack是否为空 std::cout << std::boolalpha << isEmpty << std::endl; // 输出false return 0; }运行结果为:
3
false
本文链接:http://task.lmcjl.com/news/4191.html