分类:容器、适配器 | 组件类型:类型 |
Stack是一个容器适配器,这意味着它在一些底层容器类型的基础上实现。默认情况下,该底层类型是deque,但可以显式选择一个不同的类型。
int main() { stack<int> S; S.push(8); S.push(7); S.push(4); assert(S.size() == 3); assert(S.top() == 4); S.pop(); assert(S.top() == 7); S.pop(); assert(S.top() == 8); S.pop(); assert(S.empty()); }
参数 | 说明 | 默认值 |
---|---|---|
T | 存储在堆栈中的对象的类型。 | |
Sequence | 用于实现堆栈的底层容器的类型。 | deque<T> |
成员 | 在何处定义 | 说明 |
---|---|---|
value_type | stack | 见下文。 |
size_type | stack | 见下文。 |
stack() | Default Constructible | 默认构造函数。创建一个空的stack. |
stack(const stack&) | Assignable | 拷贝构造函数。 |
stack& operator=(const stack&) | Assignable | 赋值运算符。 |
bool empty() const | stack | 见下文。 |
size_type size() const | stack | 见下文。 |
value_type& top() | stack | 见下文。 |
const value_type& top() const | stack | 见下文。 |
void push(const value_type&) | stack | 见下文。 |
void pop() [3] | stack | 见下文。 |
bool operator==(const stack&, const stack&) | stack | 见下文。 |
bool operator<(const stack&, const stack&) | stack | 见下文。 |
成员 | 说明 |
---|---|
value_type | 中存储的对象的类型stack。这与T和Sequence::value_type. |
size_type | 相同,无符号整型。这与Sequence::size_type. |
bool empty() const | 相同返回值truestack如果不包含任何元素,以及false否则。S.empty()相当于. |
size_type size() const | 返回stack. |
value_type& top() | 返回堆栈顶部元素的可变引用。先决条件empty()是不包含任何元素,以及. |
const value_type& top() const | 返回堆栈顶部元素的常引用。先决条件empty()是不包含任何元素,以及. |
void push(const value_type& x) | 插入x在堆栈顶部。后置条件size()将递增1并且top()将等于x. |
void pop() | 移除堆栈顶部的元素。 [3] 先决条件empty()是不包含任何元素,以及. 后置条件size()将递减1. |
bool operator==(const stack&, const stack&) | 比较两个堆栈是否相等。如果两个堆栈包含相同数量的元素并且逐个元素相等,则这两个堆栈相等。这是一个全局函数,而不是成员函数。 |
bool operator<(const stack&, const stack&) | 两个堆栈的字典顺序。这是一个全局函数,而不是成员函数。 |
[1] 堆栈是一种标准数据结构,所有算法书中都有讲到。例如,参见 Knuth 的 2.2.1 节。(D. E. Knuth,《计算机编程的艺术。第一卷:基本算法》,第二版。Addison-Wesley,1973。)
[2] 这是唯一一个存在stack的原因。请注意,任何 前端插入序列 或 后端插入序列 都可以用作堆栈;例如,在 vector 的情况下,堆栈操作是成员函数back, push_back并且pop_back. 使用容器适配器stack唯一的原因是为了明确你仅执行堆栈操作,不执行任何其他操作。
[3] 人们可能想知道为什么pop()返回void而不是value_type。也就是说,为什么必须使用top()和pop()检查并移除顶部元素,而不是将两者组合到一个成员函数中?事实上,这种设计有充分的理由。如果pop()返回顶部元素,则必须按值而不是按引用进行返回:按引用返回会创建一个悬空指针。但是,按值返回效率低下:它至少涉及一次冗余的复制构造函数调用。由于pop()无法以既高效又正确的方式返回值,因此它不返回值并要求客户端使用top()检查堆栈顶部的值更为合理。