在 C++ 标准库中,数据结构是高效编程的基石。容器适配器如栈(stack)、队列(queue)和优先级队列(priority_queue),以及序列容器 deque,构成了日常开发和算法题解的核心工具。它们看似简单的接口背后,是对数据存取规则的精密设计。
栈与队列:基础适配器的原理
栈遵循先进后出(LIFO),队列则是先进先出(FIFO)。默认情况下,它们的底层容器通常选用 deque,而非 vector 或 list。这是因为 deque 的分段连续存储特性,既支持高效的头尾操作,又保留了部分随机访问能力,避免了 vector 频繁扩容带来的开销,也弥补了 list 不支持随机访问的短板。
栈的实现要点
栈的核心在于限制访问点,只允许在尾部进行插入和删除。模拟实现时,我们封装一个底层容器,暴露 push、pop、top 等接口。需要注意的是,空栈调用 top 或 pop 会导致未定义行为,使用前务必检查 empty()。
namespace demo {
template<class T, class Container = std::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() const { return _con.size(); }
bool empty() const { return _con.empty(); }
private:
Container _con;
};
}
队列的实现要点
队列需要在队尾插入,队头删除。同样基于 deque 实现最为稳妥。vector 虽然内存连续,但头部删除效率低;list 头部删除快,但缓存不友好且不支持随机访问。deque 恰好平衡了这两者。
namespace demo {
template< , = std::deque<T>>
queue {
:
( T& x) { _con.(x); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
{ _con.(); }
:
Container _con;
};
}


