文章目录
- 一、容器概览与核心特性
- 核心特性速览
- 二、底层实现原理
- 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. 容器初始化
// 默认使用dequestack<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