1. STL stack容器深度解析
作为一名C++开发者,我每天都会和STL的各种容器打交道。stack(栈)这个看似简单的数据结构,在实际开发中却有着不可替代的作用。今天我就结合自己多年的项目经验,带大家彻底搞懂这个"后进先出"的容器。
stack是STL中最符合"单一职责原则"的容器之一,它完美封装了栈的所有操作。你可能觉得它功能简单,但正是这种简洁让它成为解决特定问题的利器。比如在浏览器历史记录、函数调用栈、表达式求值等场景中,stack的表现都非常出色。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. stack的核心特性与实现原理
2.1 底层容器适配器
stack在STL中实际上是一个容器适配器(container adapter),这意味着它是在其他序列容器基础上实现的。默认情况下,stack使用deque作为底层容器,但你也可以指定使用vector或list:
cpp复制stack<int> s1; // 默认使用deque
stack<int, vector<int>> s2; // 使用vector作为底层容器
选择不同底层容器会带来性能差异:
- deque:平衡了头尾操作效率(默认选择)
- vector:适合频繁push/pop且不需要频繁扩容的场景
- list:当需要保证指针稳定性时使用
2.2 时间复杂度分析
stack的所有操作都保证在常数时间内完成:
- push(): O(1)
- pop(): O(1)
- top(): O(1)
- empty(): O(1)
- size(): O(1)
这种高效性来自于它限制了对容器中间元素的操作,只允许在容器的一端进行操作。
3. stack的完整接口详解
3.1 构造函数与初始化
stack提供了多种初始化方式:
cpp复制// 默认构造
stack<int> s1;
// 使用已有容器初始化
deque<int> dq{1,2,3};
stack<int> s2(dq); // 注意这会复制dq中的元素
// C++11起支持的移动构造
deque<int> temp{4,5,6};
stack<int> s3(move(temp)); // temp现在为空
3.2 元素访问操作
stack只提供一种元素访问方式:
cpp复制stack<int> s;
s.push(10);
s.push(20);
int top = s.top(); // 20
s.top() = 30; // 修改栈顶元素
注意:调用top()前必须确保stack非空,否则是未定义行为
3.3 容量操作
cpp复制stack<int> s;
bool isEmpty = s.empty(); // true
size_t size = s.size(); // 0
s.push(1);
s.empty(); // false
s.size(); // 1
3.4 修改器操作
cpp复制stack<int> s;
s.push(1); // 栈:1
s.push(2); // 栈:1 2
s.emplace(3); // 栈:1 2 3 (C++11起支持)
s.p
