IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++常用标准模板库——queue -> 正文阅读

[数据结构与算法]C++常用标准模板库——queue

queue

queue就是队列,在STL中是实现了一个先进先出的容器,要使用queue,需要在加上queue这个头文件。

queue的定义,queue<typename> q;其中typename可以为任何类型或容器。

queue的访问,由于队列是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素,或是通过back()来访问队尾元素

? ? ? ? queue<`int`> q ;
? ? for(int i=1;i<5;i++){
? ? ? ? q.push(i) ;
? ? }
? ? cout << q.front() << endl ;
? ? cout << q.back() << endl ;
? ? 输出结果:1
4

Queue常用函数
(1) push(),push(x)将x入队,时间复杂度O(1)
(2) front(),访问队首元素,back()访问队尾元素,时间复杂度O(1)。
(3) pop(),令队首元素出队,时间复杂度O(1)。

queue<int> q ;
? ? for(int i=1;i<5;i++){
? ? ? ? q.push(i) ;
? ? }
? ? q.pop() ;
? ? cout << q.front() << endl ;
? ? cout << q.back() << endl ;
输出结果:2
4
(4) empty(),判断队列是否为空,如果是空则返回true,否则返回false。
(5) size(),返回queue内元素的个数,时间复杂度为O(1)。

? ? queue<int> q ;
? ? for(int i=1;i<5;i++){
? ? ? ? q.push(i) ;
? ? }
? ? if(!q.empty()){
? ? ? ? cout << q.size() ;
? ? }
输出结果:4

Queue的常见用途:
? ? 当需要实现广度优先搜索时,可以不用自己手工实现一个队列。在使用front()和pop()函数前,必须使用empty()判断队列是否为空,否则可能因为队空而出现错误。
?

priority_queue
priority_queue又称优先队列,其底层是用堆来进行实现的。在优先队列中,队首的元素一定是当前队列中优先级最高的那一个。C++中的堆默认是大跟堆。

priority_queue的定义,priority_queue<typename> q,typename可以为任意类型的元素。要使用优先队列,应先添加头文件#include[HTML_REMOVED]。
Priority_queue只能通过top()函数来访问队首元素(堆顶元素),也就是优先级最高的元素。

priority_queue<int> q ;
? ? q.push(3) ;
? ? q.push(1) ;
? ? q.push(5) ;
? ? cout << q.top() << endl ;
输出结果:5

Priority_queue常用函数
(1) push(x),时间复杂度O(logN),N是堆中元素的个数。
(2) top(),top()可以获得队首元素,时间复杂度O(1)
(3) pop(),令堆顶元素出队,时间复杂度O(logN),其中N是堆中的元素个数。

priority_queue<int> q ;
? ? q.push(3) ;
? ? q.push(1) ;
? ? q.push(5) ;
? ? cout << q.top() << endl ;
? ? q.pop() ;
? ? cout << q.top() << endl ;
输出结果:5
3

(4) empty(),判断队列是否为空,为空返回true,否则返回false。
(5) size(),返回优先队列中元素的个数,时间复杂度O(1)

priority_queue<int> q ;
? ? q.push(3) ;
? ? q.push(1) ;
? ? q.push(5) ;
? ? if(!q.empty()){
? ? ? ? cout << q.size() << endl ;
? ? }
输出结果:3
Priority_queue内元素的优先级设置
? ? 如何定义优先队列内元素的优先级是运用好优先队列的关键,下面分别介绍几本数据类型和结构体类型的优先级设置方法。

(1)基本数据类型的优先级设置
基本数据类型的优先级设置方法是类似的,这里用int举例。在C++中默认情况下是大根堆,所以下面两种优先队列的定义是等价的。
Priority_queue<int> q,priority_queue<int,vector<int>,less<int>> q;
可以发现第二种定义方式,后面多了两个参数,一个是vector<int>,另一个是less<int>。其中vector<int>填写的是来承载底层数据结构heap(堆)的容器;第三个参数less<int>则是对第一个参数的比较类,less[HTML_REMOVED]表示数字越大优先级越高,而greater<int>表示数字越小的优先级越大。因此,C++中定义小根堆的方式是,priority_queue<int,vector<int>,greater<int>> q。

priority_queue<int,vector<int>,greater<int>> q ;
? ? q.push(3) ;
? ? q.push(1) ;
? ? q.push(5) ;
? ? cout << q.top() << endl ;
输出结果:1
(2) 结构体的优先级设置
对结构体进行优先级设置有两种方式,第一种是在结构体内部重载小于号“<”,第二种方式是在结构体外部重载“()”,下面对这两种情况分别举个例子来说明
重载小于号“<”

struct fruit{
? ? string name ;
? ? int price ;
? ? friend bool operator < (fruit f1,fruit f2){
? ? ? ? return f1.price > f2.price ;
? ? }
};
priority_queue<fruit> q ;
? ? q.push({"apple",8}) ;
? ? q.push({"orange",7}) ;
? ? q.push({"banana",9}) ;
? ? auto ele = q.top() ;
? ? cout << ele.name << ' ' << ele.price << endl ;
输出结果:orange 7
这种情况下优先队列只能采用第一种定义方式。
重载小括号“()”

struct fruit{
? ? string name ;
? ? int price ;
};
struct cmp{
? ? bool operator () (fruit f1,fruit f2){
? ? ? ? return f1.price > f2.price ;
? ? }
};
int main(){

? ? priority_queue<fruit,vector<fruit>,cmp> q ;
? ? q.push({"apple",8}) ;
? ? q.push({"orange",7}) ;
? ? q.push({"banana",9}) ;
? ? auto ele = q.top() ;
? ? cout << ele.name << ' ' << ele.price << endl ;
? ? return 0 ;
}
输出结果:orange 7
这里的优先队列只能采用第二种定义方式。
小结,即使是基本数据类型或者STL容器,也可以通过同样的方式来定义优先级。
注意:如果结构体内的数据比较庞大,建议使用引用来提高效率,此时比较类的参数中需要加上“const”和“&”,如下所示:

friend bool operator < (const fruit& f1,cosnt fruit& f2){
? ? ? ? return f1.price > f2.price ;
? ? }
bool operator () (const fruit& f1,const fruit& f2){
? ? ? ? return f1.price > f2.price ;
? ? }
Priority_queue的常见用途
? ? Priority_queue可以解决一些贪心问题,也可以对dijkstra进行优化(因为优先队列的本质是堆),在使用top()函数前

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:10:13  更:2022-01-28 12:10:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:41:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码