C++怎么使用堆栈 C++中stack容器基础用法【入门】

3次阅读

C++怎么使用堆栈 C++中stack容器基础用法【入门】

怎么声明和初始化一个 stack

直接用 std::stack,它默认底层用 deque,不是原始数组或链表——这点很多人误以为是“系统”或能直接访问内存。声明时必须指定元素类型,不支持自动推导(c++17 也不行)。

常见错误:写成 stack s;stack<int> s{};</int> 看似没问题,但后者在某些老编译器(如 GCC 4.8)会触发默认构造失败;稳妥写法是显式绑定容器:

  • std::stack<int> s;</int> —— 最常用,依赖默认 deque
  • std::stack<int std::vector>> s;</int> —— 换成 vector 底层,适合需要连续内存的场景
  • std::stack<:string> s;</:string> —— 元素类型可以是任意可拷贝/可移动类型

pushtop 的坑:空调用会崩溃

top() 不检查栈是否为空,直接返回引用;pop() 也不返回值。一旦对空栈调用 top(),行为未定义(通常段错误);pop() 对空栈调用也是未定义。

正确做法永远先判空:

立即学习C++免费学习笔记(深入)”;

  • s.empty() 判断,别用 s.size() == 0(效率略低,且语义不如 empty() 清晰)
  • 想取顶元素并弹出?必须分两步:auto x = s.top(); s.pop();,不能合并
  • 没有 peek() 这种安全取顶函数,C++ 标准库就是这么直白

为什么不能用 stack 做遍历或随机访问

std::stack 是容器适配器,不是容器——它故意屏蔽了迭代器、operator[]begin()/end()。设计目标就是 LIFO 封装,不提供任何“越界能力”。

如果你需要遍历、查找、中间插入,说明你根本不需要 stack,该换用:

  • std::vector + 手动用 push_back/pop_back(控制权在你手上)
  • std::deque(支持头尾增删,也支持下标访问)
  • 甚至 std::list(频繁中间操作时更稳)

硬要“绕过”限制去访问底层容器?可以,但得用模板特化或友元,属于破坏封装,调试困难,不推荐。

性能差异:deque vs vector 作底层

默认 deque 底层对 push/pop 是均摊 O(1),但内存不连续,缓存局部性差;换成 vector 后,push 在容量不足时会 realloc,有少量抖动,但多数情况下访问更快。

实测差异明显的情况:

  • 元素很小(如 int)、操作极频繁(百万级)→ vector 底层通常快 10%~20%
  • 元素很大或生命周期长(如含内存的类)→ deque 避免大块内存搬运,更稳
  • 线程环境 → 两者都不自带线程安全,别指望底层切换能解决并发问题

改底层不是调参游戏,得看你的数据特征和热点路径,别盲目换。

text=ZqhQzanResources