队列
queue没有迭代器
Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。
头文件:
#include <queue>
queue<T> queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
queue& operator=(const queue &que);//重载等号操作符
函数名 | 功能 |
---|---|
.push() | 入队 |
.pop() | 出队 |
.front() | 返回队首 |
.back() | 返回队尾 |
.empty() | 判断队列是否为空(为空返回true) |
.size() | 返回队列的大小 |
实例:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int e,n,m;queue<int> q1;for(int i=0;i<10;i++) q1.push(i);if(!q1.empty()) cout<<"dui lie bu kong\n";n=q1.size();cout<<n<<endl;m=q1.back();cout<<m<<endl;for(int j=0;j<n;j++){ e=q1.front();cout<<e<<" ";q1.pop();}cout<<endl;if(q1.empty()) cout<<"dui lie kong\n";n=q1.size(); cout<<"q1.zsize is "<<n<<endl;system("PAUSE");return 0;
}
优先队列
在C++的标准模板库(STL)中,优先队列(Priority Queue)是一种特殊的队列,它允许元素按照某种优先级进行排序和出队,其底层是用堆来进行实现的。优先队列在许多高级算法和系统设计中都有应用,如在调度算法和路径查找算法中。与普通队列不同,优先队列的元素出队顺序是基于优先级,而非插入顺序。功能相当于构建了一个大顶堆(由队头到队尾为降序排列)或小顶堆(默认为这个)(由队头到队尾为升序排列)。
优先队列的定义
priority_queue<Type, Container, Functional> name;
//Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
优先队列的基本操作
- 插入元素(push):将一个元素添加到优先队列中,元素将根据其优先级排序。
- 移除元素(pop):移除优先级最高的元素。
- 访问顶部元素(top):返回优先级最高的元素而不移除它。
- 大小(size):返回优先队列中的元素数量。
- 检查空状态(empty):判断优先队列是否为空。
优先队列的应用场景
- 任务调度:在操作系统中,优先队列用来管理具有不同优先级的任务。
- 路径查找算法:如Dijkstra和A*算法中,优先队列用来选择下一个最优的节点。
- 数据流的管理:如在实时计算或网络通信中管理数据包,确保高优先级的数据先被处理。
实例:
priority_queue<int> q; //等于priority_queue<int,vector<int>,less<int>> q;
q.emplace(6);
q.emplace(1);
q.emplace(3);
q.emplace(2);
q.emplace(4);
q.emplace(5);
while (!q.empty())
{cout << q.top() << endl; //队头元素开始 顺序为654321q.pop();
}
priority_queue<int, vector<int>, greater<int>> q; //如果greater为less的话则为654321
q.emplace(6);
q.emplace(1);
q.emplace(3);
q.emplace(2);
q.emplace(4);
q.emplace(5);
while (!q.empty())
{cout << q.top() << endl; //队头元素开始 顺序为123456q.pop();
}
只能通过top()函数来访问队首元素,也就是优先级最高的元素.
#include<bits/stdc++.h>
using namespace std;
struct node {int id;float x;
};bool operator >=(const node& a, const node& b) { if (a.id!=b.id){return a.id >= b.id;}else{return a.x >= b.x;}
}int main()
{priority_queue<node, vector<node>,greater_equal<node>> q;vector<node> vecNode;vecNode.push_back({ 2,-0.2f });vecNode.push_back({ 1,-0.1f });vecNode.push_back({ 4,-0.4f });vecNode.push_back({ 3,-0.3f });vecNode.push_back({ 3,-0.5f });vecNode.push_back({ -1,-0.5f });for (int i = 0; i < vecNode.size(); i++){cout << vecNode[i].id << " " << vecNode[i].x << endl;//2 -0.2//1 -0.1//4 -0.4//3 -0.3//3 -0.5//-1 -0.5q.push(vecNode[i]);}cout << "aaa" << endl;while (!q.empty()){cout << q.top().id << " " << q.top().x << endl;//-1 -0.5//1 -0.1//2 -0.2//3 -0.5//3 -0.3//4 -0.4q.pop();}
}
结构体的优先级设置
举一个水果的例子
#方法一:通过友元函数重载小于号(第一种定义方式定义优先队列)
#include <iostream>
#include <queue>
using namespace std;
struct fruit
{string name;int price;friend bool operator < (fruit f1,fruit f2){return f1.price>f2.price;}
};
int main()
{priority_queue<fruit> q;fruit f[]={"桃子",3,"梨子",4,"苹果",1,"杏子",2};for(int i=0;i<=3;i++)q.push(f[i]);cout<<q.top().name<<" "<<q.top().price<<endl; return 0;
}
#方法二:cmp函数实现(第二种定义方式定义优先队列)
#include <iostream>
#include <queue>
using namespace std;
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;fruit f[]={"桃子",3,"梨子",4,"苹果",1,"杏子",2};for(int i=0;i<=3;i++)q.push(f[i]);cout<<q.top().name<<" "<<q.top().price<<endl; return 0;
}
双端队列
在C++的标准模板库(STL)中,双端队列(Deque,全称“double-ended queue”)是一种具有队列和栈性质的复合型容器适配器。它允许在两端快速插入和删除,同时保持随机访问的能力。
双端队列的基本概念
双端队列结合了栈和队列的特点,可以在两端进行元素的插入和删除操作。这种双向操作的灵活性使得双端队列在多种场景中都非常有用。
双端队列的基本操作
- push_back:在双端队列的末尾添加一个元素。
- push_front:在双端队列的开头添加一个元素。
- pop_back:移除双端队列末尾的元素。
- pop_front:移除双端队列开头的元素。
- back:访问双端队列末尾的元素。
- front:访问双端队列开头的元素。
- at(index):访问指定位置的元素。
- size:返回双端队列中的元素数量。
- empty:判断双端队列是否为空。
双端队列的应用场景
- 滑动窗口算法:在需要快速访问窗口两端数据的算法中,双端队列可以提供有效的支持。
- 撤销操作:在具有撤销功能的应用程序中,双端队列可以用来存储操作历史,方便进行前进和后退操作。
- 阻塞队列:在多线程编程中,双端队列可以作为生产者-消费者模型的基础数据结构。
参考博文:
https://blog.csdn.net/m0_57026473/article/details/119345340
https://blog.csdn.net/tang7mj/article/details/135248128
https://blog.csdn.net/weixin_43736974/article/details/87202381
https://blog.csdn.net/hoppingg/article/details/130143286