首页 > 后端开发 > C++ > 正文

C++容器适配器怎么使用 stack queue和priority_queue详解

P粉602998670
发布: 2025-07-17 08:57:02
原创
303人浏览过

c++++中的容器适配器是基于其他容器构建的封装类,提供特定接口实现常用数据结构行为。最常见的三个容器适配器是stack、queue和priority_queue。1. stack是后进先出(lifo)结构,默认使用deque实现,基本操作包括push、pop、top、empty和size;只能访问顶部元素,底层可更换为vector或list以优化内存开销。2. queue是先进先出(fifo)结构,默认也使用deque实现,基本操作包括push、pop、front、back、empty和size;适用于广度优先搜索和任务调度等场景,不支持随机访问或查找中间元素。3. priority_queue是内部维护堆结构的适配器,默认为最大堆,基本操作包括push、pop、top、empty和size;可自定义比较逻辑实现最小堆或其他排序方式,底层必须使用支持随机访问的容器如vector或deque;插入和删除复杂度为o(log n),不能修改中间元素以免破坏堆结构。此外,这三种适配器均不支持迭代器访问,选择合适底层容器和理解其限制对性能至关重要。

C++容器适配器怎么使用 stack queue和priority_queue详解

在 C++ 中,容器适配器(Container Adaptors)是基于其他容器(如 vectordequelist)构建的封装类,提供了特定接口来实现常用的数据结构行为。最常见的三个容器适配器是 stackqueuepriority_queue。它们不提供迭代器访问元素,而是通过特定的操作方式来管理数据。

C++容器适配器怎么使用 stack queue和priority_queue详解

下面分别介绍这三个适配器的使用方法和注意事项,适合实际编程中快速查阅和应用。


stack:后进先出的数据结构

std::stack 是一个后进先出(LIFO)的容器适配器,默认底层使用 deque 实现,也可以指定为 vectorlist

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

C++容器适配器怎么使用 stack queue和priority_queue详解

基本操作包括:

  • push():压入元素到栈顶
  • pop():弹出栈顶元素
  • top():访问栈顶元素(不删除)
  • empty():判断是否为空
  • size():返回元素个数
#include <stack>
std::stack<int> s;
s.push(1);
s.push(2);
int top = s.top();  // 得到 2
s.pop();            // 弹出 2
登录后复制

注意点:

C++容器适配器怎么使用 stack queue和priority_queue详解
  • 栈只能访问顶部元素,不能遍历
  • 底层容器可以更换,比如 std::stack<int, std::vector<int>> s;
  • 如果频繁压栈且内存有限,考虑用 vector 替代默认的 deque,以减少分段内存开销

queue:先进先出的数据结构

std::queue 是一个先进先出(FIFO)的容器适配器,默认也使用 deque 实现。

豆绘AI
豆绘AI

豆绘AI是国内领先的AI绘图与设计平台,支持照片、设计、绘画的一键生成。

豆绘AI 485
查看详情 豆绘AI

基本操作有:

  • push():在队尾添加元素
  • pop():移除队首元素
  • front():访问队首元素
  • back():访问队尾元素
  • empty() / size():同 stack
#include <queue>
std::queue<int> q;
q.push(10);
q.push(20);
int first = q.front();  // 得到 10
q.pop();                // 移除 10
登录后复制

使用建议:

  • 常用于广度优先搜索、任务调度等场景
  • 默认底层是 deque,性能通常足够好
  • 不支持随机访问,也不能直接清空或查找中间元素

priority_queue:带优先级的队列

std::priority_queue 是一个内部维护堆结构的容器适配器,默认是一个最大堆(大根堆),即每次取出的是当前最大的元素。

基本操作包括:

  • push():插入元素并调整堆
  • pop():移除堆顶元素
  • top():访问堆顶元素
  • empty() / size()
#include <queue>
std::priority_queue<int> pq;
pq.push(3);
pq.push(1);
pq.push(4);
int max = pq.top();  // 得到 4
pq.pop();
登录后复制

自定义排序方式: 如果你想使用最小堆或者其他比较逻辑,可以通过传入比较函数对象来改变默认行为:

// 最小堆
std::priority_queue<int, std::vector<int>, std::greater<>> min_heap;

// 自定义结构体需要重载 operator<
struct Node {
    int val;
    bool operator<(const Node& other) const {
        return val > other.val;  // 小顶堆
    }
};
std::priority_queue<Node> heap;
登录后复制

注意细节:

  • 插入和删除时间复杂度为 O(log n)
  • 底层必须使用支持随机访问的容器,如 vectordeque
  • 没有 front() / back(),只有 top() 访问堆顶
  • 不能修改中间元素,否则会破坏堆结构

总结一下常见误区和技巧

  • 不要尝试对 stackqueuepriority_queue 使用迭代器,它们本身不支持。
  • 选择合适的底层容器很重要,特别是当性能敏感时。
  • 优先队列的比较逻辑要小心定义,尤其是结构体类型。
  • 如果你需要频繁查找中间值或者动态调整优先级,可能更适合自己实现堆结构或使用 set 等结构。

基本上就这些内容了。这三者都是 STL 提供的封装,使用起来简单,但理解它们的行为和限制才能真正发挥其作用。

以上就是C++容器适配器怎么使用 stack queue和priority_queue详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号