概述
在 C++ 标准库的庞大体系中,数据结构是支撑高效编程的基石。容器适配器、序列容器以及相关的算法逻辑,构成了其中最具实用价值的核心内容。无论是日常开发还是算法刷题,栈(stack)、队列(queue)、优先级队列(priority_queue)这些'常客'的身影几乎无处不在。
它们看似简单的接口背后,藏着对数据存取规则的精妙设计:栈的'先进后出'适配递归调用、括号匹配等场景;队列的'先进先出'适配层序遍历、任务调度等需求;优先级队列则通过堆结构实现带权重的数据筛选,成为 TopK 问题的利器。
深入学习这些结构时,我们往往会产生更多疑问:为什么栈和队列的默认底层容器是 deque 而非 vector 或 list?deque 的'分段连续'存储到底特殊在哪里?优先级队列中,仿函数是如何灵活控制堆的排序逻辑的?反向迭代器的设计又暗藏哪些技巧?本文不仅会系统梳理核心接口与使用场景,更会通过完整的模拟实现代码,拆解容器适配器的封装逻辑,帮你理清细节,从'会用'进阶到'精通'。
栈 (Stack)
栈遵循后进先出(LIFO)原则,注意区分栈顶和栈底——栈顶是最后放入的那个元素。
常用接口一览
empty(): 判断是否为空size(): 获取元素数量top(): 访问栈顶元素push(val): 压入元素pop(): 弹出栈顶元素
注意:没有迭代器,不要尝试访问空的栈,否则可能引发未定义行为。
模拟实现
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.back(); }
size_t size() { return _con.size(); }
bool empty() { _con.(); }
:
Container _con;
};
}


