【C++】优先队列priority_queue
2016-01-21 15:11
489 查看
优先队列是队列的一种,允许用户对队列中存储的元素设置优先级。按照数据的优先级来对队列中的数据进行动态的排序。每次的push和pop操作,队列都会动态的调整。
所以我们无论按照什么顺序push一堆数据,最终在队列里总是top出最大的元素。
1、标准库默认使用元素类型的<操作符来确定他们之间的优先关系。
2、数据越小,优先级越高
priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
3、自定义优先级,重载默认符号,重载默认的
< 符号。
示例:
运行结果:
所以我们无论按照什么顺序push一堆数据,最终在队列里总是top出最大的元素。
1、标准库默认使用元素类型的<操作符来确定他们之间的优先关系。
priority_queue<int> pq;
2、数据越小,优先级越高
priority_queue<int, vector<int>, greater<int> >pq;
priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
3、自定义优先级,重载默认符号,重载默认的
< 符号。
示例:
int main() { const int len = 5; int a[len] = {5,10,4,6,3}; priority_queue<int> pq1; for(int i = 0; i < len; i++) { pq1.push(a[i]); } for(int i = 0; i < 5; i++) { cout<<pq1.top()<<" "; pq1.pop(); } cout<<endl; priority_queue<int, vector<int>, greater<int>> pq2; for(int i = 0; i < len; i++) { pq2.push(a[i]); } for(int i = 0; i < 5; i++) { cout<<pq2.top()<<" "; pq2.pop(); } cout<<endl; priority_queue<node,vector<node>, Compare> pq3; node bn[len]; bn[0].priority = 6; bn[0].value = 1; bn[1].priority = 5; bn[1].value = 4; bn[2].priority = 8; bn[2].value = 2; bn[3].priority = 4; bn[3].value = 5; bn[4].priority = 2; bn[4].value = 3; for(int i = 0; i < len; i++) { pq3.push(bn[i]); } for(int i = 0; i < 5; i++) { cout<<pq3.top().priority<<" "<<pq3.top().value<<" "<<endl; pq3.pop(); } cout<<endl; return 0; }
运行结果:
相关文章推荐
- c++中const使用详解
- 详解C++中的函数调用和下标以及成员访问运算符的重载
- C语言 百炼成钢4
- 学习C++(2)之类的静态成员及静态成员函数
- 简单了解C++语言中的二元运算符和赋值运算符
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- C++/Python
- C语言static
- <笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)
- Java与C++的编程差异
- Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法
- CPP Primer 5th 笔记(一)
- OpenCV人脸识别C++源码分析
- 翠竹林 Opencv+C++之人脸识别
- OpenCV 2.4+ C++ 人脸识别
- 学习C++(1)之类的拷贝构造
- 判断字符串中的括号是否匹配-C语言
- C语言中的#和##
- C语言中的#和##
- C语言中的#和##