设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间18 现在时间18 缓存数据 凭什么要把我教给你的东西,都给下一个女孩子。

凭什么要把我教给你的东西,都给下一个女孩子。 -- 还是分开

查看: 1506|回复: 3

深入了解C++优先队列(priority_queue)的使用方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:229
  • 打卡月天数:0
  • 打卡总奖励:3290
  • 最近打卡:2025-04-23 06:15:59
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
365
主题
347
精华
0
金钱
4409
积分
773
注册时间
2023-1-7
最后登录
2025-5-31

发表于 2023-5-2 16:07:08 | 显示全部楼层 |阅读模式
优先队列的基本概念

在计算机科学中,优先队列是一种抽象数据类型,它与队列相似,但是每个元素都有一个相关的优先级。在优先队列中,当我们执行插入操作时,我们将元素插入到队列中,并根据其优先级对其进行排序。在删除操作中,我们会删除优先级最高的元素,并把队列进行重新排序。优先队列通常使用堆来实现。
C++中的优先队列是一个容器适配器(container adapter),它提供了一种在元素之间维护优先级的方法。使用C++优先队列,你可以在队列头部添加新元素,并从队列头部移除元素。当添加元素时,它将根据元素的排序准则将其放置在适当的位置。

优先队列的使用方法

在C++中,我们可以使用头文件"queue"中的priority_queue来创建一个优先队列。接下来是一个简单的代码示例,它说明了如何使用priority_queue创建一个整数类型的队列。
  1. #include <iostream>
  2. #include <queue>

  3. int main() {
  4.     std::priority_queue<int> pq;

  5.     pq.push(1);
  6.     pq.push(2);
  7.     pq.push(3);
  8.    
  9.     std::cout << "Queue Size : " << pq.size() << std::endl;
  10.     std::cout << "Top Element: " << pq.top() << std::endl;

  11.     while(!pq.empty()) {
  12.         std::cout << pq.top() << std::endl;
  13.         pq.pop();
  14.     }
  15.     return 0;
  16. }
复制代码
在上面的代码中,我们首先包含头文件"queue",并使用std::priority_queue来创建一个整数类型的优先队列。接下来,我们使用push()方法向队列中添加元素。在添加元素后,我们可以使用size()方法来检查队列的大小。我们还可以使用top()方法获取队列的顶部元素。
在while循环中,我们使用top()方法检查顶部元素,并使用pop()方法从队列中删除它。

优先队列元素的排序规则

默认情况下,C++优先队列使用std::less来确定哪个元素具有更高的优先级。这意味着优先队列中的元素以升序排列。如果您想使用降序排列,您可以将std::greater用作参数。
接下来是一个降序排列的示例:
  1. #include <iostream>
  2. #include <queue>

  3. int main() {
  4.     std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

  5.     pq.push(3);
  6.     pq.push(2);
  7.     pq.push(1);
  8.    
  9.     std::cout << "Queue Size : " << pq.size() << std::endl;
  10.     std::cout << "Top Element: " << pq.top() << std::endl;

  11.     while(!pq.empty()) {
  12.         std::cout << pq.top() << std::endl;
  13.         pq.pop();
  14.     }
  15.     return 0;
  16. }
复制代码
在上述代码中,我们向priority_queue的构造函数中添加了第三个参数std::greater。这表示我们正在使用降序排列。

元素的自定义排序

有时,您可能需要使用自定义排序规则将元素插入到C++优先队列中。在这种情况下,您可以使用lambda表达式或者实现一个二元谓词(类似于比较函数)。
接下来是一个使用lambda表达式进行排序的示例:
  1. #include <iostream>
  2. #include <queue>

  3. struct custom_struct {
  4.     int priority;
  5.     std::string message;

  6.     custom_struct(int priority_, std::string message_) : priority(priority_), message(message_) {}
  7. };

  8. int main() {
  9.     auto comp = [](custom_struct a, custom_struct b) {return a.priority > b.priority;};
  10.     std::priority_queue<custom_struct, std::vector<custom_struct>, decltype(comp)> pq(comp);

  11.     pq.push(custom_struct(1, "Hello"));
  12.     pq.push(custom_struct(2, "World"));
  13.     pq.push(custom_struct(3, "Priority"));
  14.    
  15.     std::cout << "Queue Size : " << pq.size() << std::endl;
  16.     std::cout << "Top Element: " << pq.top().message << std::endl;

  17.     while(!pq.empty()) {
  18.         std::cout << pq.top().message << std::endl;
  19.         pq.pop();
  20.     }
  21.     return 0;
  22. }
复制代码
在上述代码中,我们首先定义一个名为custom_struct的自定义结构体。接下来,我们使用lambda表达式定义了一个比较二元谓词。第三个参数是我们自定义的二元谓词。最后,我们创建了一个custom_struct类型的优先队列,并在其构造函数中使用comp参数,这将使用我们刚刚定义的比较谓词对元素进行排序。

优先队列的时间复杂度

C++优先队列是使用堆来实现的。插入和删除元素的时间复杂度为O(log(n)),其中n是队列中的元素数。获取队列顶部元素的时间复杂度为O(1)。由于我们使用的是标准容器库,所以这些时间复杂度是可以保证的。

总结

C++优先队列是一种非常有用的数据结构,它允许我们以有序的方式存储和访问元素。无论是从插入元素的角度还是从获取顶端元素的角度来看,使用C++优先队列都比自己手动实现堆或者排序数组更加快速和便捷。掌握C++优先队列可以让您更轻松地完成许多常见的编程任务,并且可以提高您的编码效率和代码质量。
到此这篇关于深入了解C++优先队列(priority_queue)的使用方法的文章就介绍到这了,更多相关C++ 优先队列内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2023-10-31 07:18:22 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:23
  • 最近打卡:2024-12-03 15:28:27
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
36
积分
6
注册时间
2023-8-9
最后登录
2024-12-3

发表于 2024-11-2 20:33:30 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:24
  • 打卡月天数:0
  • 打卡总奖励:313
  • 最近打卡:2025-04-14 23:19:34
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
358
积分
54
注册时间
2023-3-27
最后登录
2025-4-14

发表于 2025-4-20 08:33:06 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表