文章目录
Part.I Attention
queue<T>
容器适配器的数据是以 FIFO (Fisrt in First Out, 先进先出) 的方式组织的,可以将它想象成等着做核酸的一队人。- 必须要包含头文件
#include <queue>
- 头文件
queue
中不但定义queue
,还定义了priority_queue
。 priority_queue<T>
:优先队列,它和queue
不同的就在于我们可以自定义其中数据的优先级,让优先级高的排在队列前面,优先出队。默认降序,大根堆,队头元素最大。pop()
删除队列中的第一个元素,但是什么也不返回。
Part.II Funciton
Chap.I queue
queue
对象很简单,它只有9个函数,如下图所示:
下面是对各个函数的说明:
函数 | 解释 |
---|---|
front() | 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
back() | 返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
push(const T& obj) | 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 |
push(T&& obj) | 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 |
pop() | 删除 queue 中的第一个元素,什么也不返回。 |
size() | 返回 queue 中元素的个数。 |
empty() | 如果 queue 中没有元素的话,返回 true。 |
emplace() | 用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。 |
swap(queue<T> &other_q) | 将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。 |
Chap.II priority_queue
priority_queue
对象和queue
对象的函数不尽相同,它的函数有点类似与堆栈的函数,如下:
函数 | 含义 |
---|---|
push(const T& obj) | 将obj的副本放到容器的适当位置,这通常会包含一个排序操作。 |
push(T&& obj) | 将obj放到容器的适当位置,这通常会包含一个排序操作。 |
emplace(T constructor a rgs...) | 通过调用传入参数的构造函数,在序列的适当位置构造一个T 对象。为了维持优先顺序,通常需要一个排序操作。 |
top() | 返回优先级队列中第一个元素的引用。 |
pop() | 移除第一个元素。 |
size() | 返回队列中元素的个数。 |
empty() | 如果队列为空的话,返回true。 |
swap(priority_queue<T>& other) | 和参数的元素进行交换,所包含对象的类型必须相同。 |
Part.III Code
下面是笔者学习此种数据结构所写的简单的示例。
Chap.I queue
完整代码如下:
#include <iostream>
#include <iomanip>
#include <queue>
using namespace std;
int main()
{
int tmp=0;
queue<int> que({0,1,2,3}); // queue<int> que;
queue<int> que1({0,1,2,3});
cout<< que.back() << setw(3) << que.front() <<endl;
que.push(4);
que.emplace(5);
cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
que.pop();
cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
que.swap(que1);
cout<< que.back() << setw(3) << que.front() << setw(3) << que.size() <<endl;
getchar();
return 0;
}
输出如下:
3 0
5 0 6
5 1 5
3 0 4
Chap.II priority_queue
完整代码如下:
#include <iostream>
#include <iomanip>
#include <queue>
#include <vector>
using namespace std;
int main()
{
int tmp=0;
string st[]={"one","two","three","four","five","six","seven"};
priority_queue<string, vector<string>, greater<string>> pq; // priority_queue<string> que;
priority_queue<string, vector<string>, greater<string>> pq1;
for(auto& c:st) { pq.push(c); }
pq1=pq;
while(!pq.empty()) {
cout<<pq.top()<<" ";
pq.pop();
}
cout<<endl;
cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
pq.swap(pq1);
cout<<setw(3)<<pq.size()<<setw(3)<<pq1.size()<<endl;
getchar();
return 0;
}
输出如下:
five four one seven six three two
0 7
7 0
看priority_queue
的构造函数:
priority_queue<T> p; //默认降序,大根堆,队头元素最大
priority_queue<T, vector<T>, less<T>> p; //相当于默认
priority_queue<T, vector<T>, greater<T>> p; //升序,最小值优先级队列,小根堆
priority_queue<string, vector<string>, greater<string>> pq
- 第一个参数是一个用来对元素排序的函数对象
- 第二个参数是一个提供初始元素的容器
- 第三个参数指定排序的规则
其他的都比较好理解。