文章目录
- 一、容器概览与核心特性
-
- 核心特性速览
- 二、底层实现原理
-
- 1. 容器适配器设计
- 2. 默认容器对比
- 三、核心操作详解
-
- 1. 容器初始化
- 2. 元素操作接口
- 3. 自定义栈实现
- 四、实战应用场景
-
- 1. 括号匹配校验
- 2. 浏览器历史记录管理
- 五、性能优化策略
-
- 1. 底层容器选择基准
- 2. 内存预分配技巧
- 六、注意事项与陷阱
-
- 1. 常见错误操作
- 2. 线程安全性问题
- 七、C++新标准增强
-
- 1. C++11 emplace优化
- 2. C++17结构化绑定(需容器支持)
- 总结与最佳实践
-
- 选择栈的三大准则
- 性能优化清单
- 典型应用场景
一、容器概览与核心特性
std::stack
是C++标准模板库(STL)提供的容器适配器,遵循后进先出(LIFO)原则。它基于底层容器(默认std::deque
)封装实现,为栈操作提供统一接口。
核心特性速览
特性 | 说明 |
---|---|
底层容器 | 默认deque,可指定list/vector |
时间复杂度 | push/pop/top均为O(1) |
空间复杂度 | 与底层容器一致 |
迭代器支持 | ❌ 不支持遍历操作 |
头文件 | <stack> |
二、底层实现原理
1. 容器适配器设计
stack
通过组合现有容器实现功能,类声明原型:
template<
typename T,
typename Container = std::deque<T>
> class stack;
支持的可选底层容器需满足以下接口:
-
back()
-
push_back()
-
pop_back()
-
empty()
-
size()
2. 默认容器对比
底层容器 | 优点 | 缺点 |
---|---|---|
deque | 快速首尾操作(默认最优解) | 内存非连续 |
vector | 内存连续,缓存友好 | 尾部扩容时性能抖动 |
list | 稳定性能,无需扩容 | 内存碎片化,访问效率低 |
三、核心操作详解
1. 容器初始化
// 默认使用deque
stack<int> s1;
// 指定底层容器
stack<string, vector<string>> s2;
stack<double, list<double>> s3;
// 通过已有容器初始化
vector<int> vec {
1,2,3};
stack<int, vector<int>> s4(vec); // 注意:复制容器内容
2. 元素操作接口
stack<string> history;
// 压栈操作
history.push("page1"); // 拷贝插入
history.emplace("page2"); // 原地构造(C++11)
// 访问栈顶
cout << "Current: " << history.top();
// 弹栈操作
history.pop(); // 注意:返回void,需先获取top()
// 容量检查
if (!history.empty()) {
cout << "Stack size: " << history.size();
}
3. 自定义栈实现
template<typename T, typename Container = deque<T