0

0

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

P粉602998670

P粉602998670

发布时间:2025-07-17 08:57:02

|

314人浏览过

|

来源于php中文网

原创

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 
std::stack s;
s.push(1);
s.push(2);
int top = s.top();  // 得到 2
s.pop();            // 弹出 2

注意点:

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

queue:先进先出的数据结构

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

Copilot
Copilot

Copilot是由微软公司开发的一款AI生产力工具,旨在通过先进的人工智能技术,帮助用户快速完成各种任务,提升工作效率。

下载

基本操作有:

  • push():在队尾添加元素
  • pop():移除队首元素
  • front():访问队首元素
  • back():访问队尾元素
  • empty() / size():同 stack
#include 
std::queue 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 
std::priority_queue pq;
pq.push(3);
pq.push(1);
pq.push(4);
int max = pq.top();  // 得到 4
pq.pop();

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

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

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

注意细节:

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

总结一下常见误区和技巧

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

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

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

185

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

521

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

188

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

5

2025.12.22

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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