前言
在 C++ 标准库的庞大体系中,数据结构是支撑高效编程的基石,而容器适配器、序列容器以及相关的算法逻辑,则是其中最具实用价值的核心内容。无论是日常开发还是算法刷题,栈(stack)、队列(queue)、优先级队列(priority_queue)这些'常客'的身影几乎无处不在,它们看似简单的接口背后,藏着对数据存取规则的精妙设计——栈的'先进后出'适配递归调用、括号匹配等场景,队列的'先进先出'适配层序遍历、任务调度等需求,优先级队列则通过堆结构实现带权重的数据筛选,成为 TopK 问题的利器。
深入学习这些结构时,我们往往会产生更多疑问:为什么栈和队列的默认底层容器是 deque 而非 vector 或 list?deque 的'分段连续'存储到底特殊在哪里,能同时兼顾头尾操作效率与一定的随机访问能力?优先级队列中,仿函数(函数对象)是如何灵活控制堆的排序逻辑的?反向迭代器的设计又暗藏哪些技巧,能让遍历方向反转却不影响底层数据结构?这些问题的答案,恰恰是从'会用'到'精通'的关键。
本文不仅会系统梳理栈、队列、deque、优先级队列的核心接口与使用场景,更会通过完整的模拟实现代码,拆解容器适配器的封装逻辑——比如栈如何基于 deque 的尾插尾删实现'先进后出',优先级队列如何通过向上/向下调整算法维护堆结构。同时,针对仿函数、反向迭代器等容易混淆的概念,我们会结合实例解析其原理与应用,帮你理清'less 与 greater 的区别''反向迭代器的 ++ 为何是底层迭代器的 --'等细节。
理论之外,实战更能检验掌握程度。文中精选了力扣(如最小栈、二叉树层序遍历、数组第 K 大元素)和牛客网(如栈的压入弹出序列)的经典题目,不仅提供解题思路,更附上完整代码实现,让你在刷题中直观感受容器的妙用。此外,针对容器特性的选择题解析(如不同容器迭代器的失效问题、deque 与 vector 的区别),能帮你规避学习中的常见误区。
无论你是刚接触 C++ 容器的初学者,还是想夯实数据结构基础的进阶者,这篇内容都能为你搭建一条从底层原理到实战应用的清晰路径。吃透这些知识,不仅能让你在面对复杂问题时快速找到数据结构选型的最优解,更能培养对代码逻辑的深层理解——毕竟,真正的编程能力,从来都藏在对'为什么这样设计'的追问与探索中。
Stack
栈的话是先进后出
注意区分栈顶和栈底–栈顶是最后放入的那个
常用接口
empty()size()top()push(val)pop()
注意:没有迭代器,不要去访问空的栈–可能有未定义行为
Stack 的模拟实现
namespace renshen {
// 容器适配器
template<class T, class Container = deque<T>>
class stack {
public:
void push(const T& x) { _con.push_back(x); }
void pop() { _con.pop_back(); }
T& top() { return _con.(); }
{ _con.(); }
{ _con.(); }
:
Container _con;
};
}


