STL 中的 stack 是一种容器适配器,而不是一种容器。
它是容器适配器是指,只要支持一系列方法的容器(empty, size, back, push_back, pop_back),都能作为stack使用。
stack 有可能实际上是一个 vector, deque 或 list. 如果没有特殊指明,将使用 deque作为stack的实际容器。
构造函数
构造函数中包含两个模板参数。stack<stack::alue_type T, stack::container_type Container>
其中 T代表数值类型,可以是基本数据类型或用户自定义类型。
Container代表容器类型,可以是 vector, deque 或 list
1 std::stack<int> first; // empty stack 2 std::stack<int> second(mydeque); // stack initialized to copy of deque 3 std::stack<int, std::vector<int>> third; // empty stack using vector 4 std::stack<int, std::vector<int>> fourth(myVector); // stack initialized to copy of vector using vector
成员函数
empty()
测试栈是否为空,为空返回true,否则返回false。
bool empty() const;
size()
返回栈中元素的个数
size_type size() const;
top()
返回栈顶元素(最后push进来的那个)的引用。
referenc& top();
push(val)
压一个值到栈中,其值将被初始化为 val
void push(const value_type& val);
pop()
将栈顶元素弹出,注意这个函数无返回值,如果需要获取栈顶元素,应先调用top(),再pop()
void pop();
emplace(Args..)
emplace 功能上与 push相同。不过emplace更高效。
emplace 的参数不是容器元素本身,而是构造容器元素所需要的参数。即如果容器元素是一个类的对象,那么Args就是这个类构造函数的参数。
push 是先构造一个 temporary 的元素对象,再将这个对象拷贝到容器中。而emplace是直接在容器内用参数构造一个对象。省略了拷贝的时间消耗。
emplace 本质上是调用了各容器的 emplace_back(args...)函数
swap()
swap将两个 stack的内容交换。这两个 stack的模板参数 T和 Container必须都相同。
void swap(stack& x) 重载1:x.swap(y)
void swap(stack& x, stack& y) 重载2: swap(x, y)
关系运算符
取决于实际容器的关系运算符