当前位置: 首页 > news >正文

C++ 常用的数据结构(适配器容量:栈、队列、优先队列)

文章目录

      • 适配器容器的共性
      • 栈(`stack`)
        • 特点
        • 常用操作
        • 示例代码
        • 自定义底层容器
      • 队列(`queue`)
        • 特点
        • 常用操作
        • 示例代码
      • 优先队列(`priority_queue`)
        • 特点
        • 常用操作
        • 示例代码
        • 自定义比较函数
      • 适配器容器的应用场景
      • 选择底层容器的建议
      • 注意事项

在 C++ 中, 适配器容器(Adapter Containers) 是一种特殊的容器,它们不直接提供存储功能,而是通过封装其他基础容器(如 vectordequelist)来提供特定的接口和行为。C++ 标准库提供了三种适配器容器: 栈(stack队列(queue优先队列(priority_queue

适配器容器的共性

  1. 封装基础容器:适配器通过组合一个基础容器来实现功能,默认使用 deque,但可指定其他容器(如 vectorlist)。
  2. 限制访问接口:适配器隐藏了基础容器的大部分接口,仅暴露特定的操作(如栈的 push/pop),确保数据遵循特定的访问规则。
  3. 模板参数:适配器的模板参数格式为:
    template <class T,                        // 元素类型class Container = deque<T>      // 基础容器类型(默认 deque)
    > class Adapter;
    

栈(stack

特点
  • 后进先出(LIFO):最后入栈的元素最先出栈。
  • 默认底层容器deque(支持高效的尾部插入/删除)。
常用操作
操作功能时间复杂度
push(x)将元素 x 压入栈顶O(1)
pop()移除栈顶元素(不返回值)O(1)
top()返回栈顶元素的引用O(1)
empty()判断栈是否为空O(1)
size()返回栈中元素的数量O(1)
示例代码
#include <stack>
#include <iostream>int main() {std::stack<int> s;  // 默认使用 deques.push(10);s.push(20);std::cout << s.top() << std::endl;  // 输出: 20s.pop();std::cout << s.top() << std::endl;  // 输出: 10return 0;
}
自定义底层容器
// 使用 vector 作为底层容器
std::stack<int, std::vector<int>> s;// 使用 list 作为底层容器
std::stack<int, std::list<int>> s;

队列(queue

特点
  • 先进先出(FIFO):最先入队的元素最先出队。
  • 默认底层容器deque(支持高效的头部和尾部操作)。
常用操作
操作功能时间复杂度
push(x)将元素 x 加入队尾O(1)
pop()移除队首元素(不返回值)O(1)
front()返回队首元素的引用O(1)
back()返回队尾元素的引用O(1)
empty()判断队列是否为空O(1)
size()返回队列中元素的数量O(1)
示例代码
#include <queue>
#include <iostream>int main() {std::queue<int> q;q.push(10);q.push(20);std::cout << q.front() << std::endl;  // 输出: 10q.pop();std::cout << q.front() << std::endl;  // 输出: 20return 0;
}

优先队列(priority_queue

特点
  • 元素按优先级出队:默认最大元素优先出队(大顶堆),也可配置为小顶堆。
  • 底层实现:基于堆(Heap),默认使用 vector 存储数据。
常用操作
操作功能时间复杂度
push(x)插入元素 x 并调整堆O(log n)
pop()移除堆顶元素(最大/最小值)O(log n)
top()返回堆顶元素的引用O(1)
empty()判断队列是否为空O(1)
size()返回队列中元素的数量O(1)
示例代码
#include <queue>
#include <iostream>int main() {// 大顶堆(默认)std::priority_queue<int> max_heap;max_heap.push(30);max_heap.push(10);max_heap.push(20);std::cout << max_heap.top() << std::endl;  // 输出: 30// 小顶堆std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;min_heap.push(30);min_heap.push(10);min_heap.push(20);std::cout << min_heap.top() << std::endl;  // 输出: 10return 0;
}
自定义比较函数
// 自定义结构体的优先队列
struct Node {int val;Node(int v) : val(v) {}
};// 按 val 从大到小排序(小顶堆)
struct Compare {bool operator()(const Node& a, const Node& b) const {return a.val > b.val;}
};std::priority_queue<Node, std::vector<Node>, Compare> pq;

适配器容器的应用场景

适配器典型应用场景
stack- 递归模拟(如 DFS)
- 表达式求值(中缀转后缀)
- 括号匹配问题
queue- BFS(广度优先搜索)
- 任务调度(如生产者-消费者模型)
priority_queue- 贪心算法(如霍夫曼编码)
- Dijkstra 算法
- 数据流中位数问题

选择底层容器的建议

  1. stack

    • 默认 deque:平衡的内存使用和性能。
    • 使用 vector:若需连续内存(如频繁随机访问栈中元素)。
    • 使用 list:若需频繁插入/删除中间元素。
  2. queue

    • 默认 deque:支持高效的双端操作。
    • 使用 list:若需频繁插入/删除中间元素。
  3. priority_queue

    • 默认 vector:堆操作需要随机访问,vector 性能最优。

注意事项

  1. 空容器操作风险:调用 top()front()back()pop() 前必须确保容器非空,否则会导致未定义行为。
  2. 性能差异:不同底层容器的选择可能影响性能(如 vector 扩容导致的拷贝开销)。
  3. 优先队列的比较函数:比较函数决定了元素的优先级顺序(a < b 为大顶堆,a > b 为小顶堆)。
http://www.lryc.cn/news/599487.html

相关文章:

  • 海云安斩获“智能金融创新应用“标杆案例 彰显AI安全左移技术创新实力
  • 智能网关芯片:物联网连接的核心引擎
  • VR 污水处理技术赋能广州猎德污水处理厂,处理效率显著提升
  • FastDFS如何提供HTTP访问电子影像文件
  • 网络协议,DHCP 协议等。
  • 每日面试题14:CMS与G1垃圾回收器的区别
  • http-proxy-middleware MaxListenersExceededWarning
  • Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网数据管理与边缘计算协同中的创新实践(364)
  • 零碳园区如何破局?安科瑞EMS3.0以智慧能源管理重构低碳未来
  • 借助Aspose.HTML控件,在 Python 中将 SVG 转换为 PDF
  • Kimi K2 大语言模型技术特性与应用实践分析
  • 酷暑来袭,科技如何让城市清凉又洁净?
  • 冠捷科技 | 内生外化,精准触达,实现数字化转型精准赋能
  • Pytorch混合精度训练最佳实践
  • 人工智能冗余:大语言模型为何有时表现不佳(以及我们能做些什么)
  • 广东省省考备考——常识:科技常识(持续更新)
  • 【指南版】网络与信息安全岗位系列(一):网络安全工程师
  • DNF: Decouple and Feedback Network for Seeing in the Dark
  • 深入解析MongoDB分片原理与运维实践指南
  • OpenCV 图像变换全解析:从镜像翻转到仿射变换的实践指南
  • docker搭建ray集群
  • NodeJS搭建SSE接口服务
  • 【C#补全计划:类和对象(七)—— 重写虚方法】
  • 重构 MVC:让经典架构完美适配复杂智能系统的后端业务逻辑层(内附框架示例代码)
  • 图片查重从设计到实现(4)图片向量化存储-Milvus 单机版部署
  • 【大模型实战】提示工程(Prompt Engineering)
  • 《基于电阻抗断层扫描(EIT)驱动的肌肉骨骼模型表征人体手臂动态意图用于人机交互》论文解读
  • SpringBoot实战指南:从快速入门到生产级部署(2025最新版)
  • Linux进程信号——信号保存
  • RWA项目面临的主要风险有哪些?例如市场风险、技术风险和法律风险。