C++ priority_queue
2016-07-12 19:30
441 查看
今天写下载任务等待队列时想要先进后出,就想起了priority_queue,顺便就整理一下啦。
优先级队列(priority_queue)是根据元素的优先级被读取,接口和queues非常相近。可以通过template参数指定一个排序准则。
模板声明带有三个参数,priority_queue< Type, Container, Functional>,Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 不能用 list.缺省的排序准则是利用operator< 形成降序排列,即大顶堆,队头元素最大。
定义在头文件中:
因为priority queue用到STL heap算法,所以其内部容器必须支持随机存取迭代器。
接口:
push() 将一个元素置于priority queue中
top() 返回priority queue中的“下一个元素”
pop() 从priority queue 中移除一个元素
注意:如果priority queue 内没有元素,执行top()和pop()会导致未定义的行为,应该先采用size()或empty()来检验容器是否为空。
例子
上面说了,第三个参数为元素比较方式,可自定义,例如下面实现小顶堆:
优先级队列(priority_queue)是根据元素的优先级被读取,接口和queues非常相近。可以通过template参数指定一个排序准则。
模板声明带有三个参数,priority_queue< Type, Container, Functional>,Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 不能用 list.缺省的排序准则是利用operator< 形成降序排列,即大顶堆,队头元素最大。
定义在头文件中:
namespace std { template < class T , class Container = vector<T> , class Compare = less <typename Container::value_type> > class priority_queue ; }
因为priority queue用到STL heap算法,所以其内部容器必须支持随机存取迭代器。
接口:
push() 将一个元素置于priority queue中
top() 返回priority queue中的“下一个元素”
pop() 从priority queue 中移除一个元素
注意:如果priority queue 内没有元素,执行top()和pop()会导致未定义的行为,应该先采用size()或empty()来检验容器是否为空。
例子
#include <iostream> #include <queue> using namespace std; int main(){ priority_queue<int,vector<int>,less<int> >q;//使用priority_queue<int> q1;一样 for(int i=0;i<10;i++) q1.push(i); while(!q1.empty()){ cout<<q1.top()<< endl; q1.pop(); } return 0; }
上面说了,第三个参数为元素比较方式,可自定义,例如下面实现小顶堆:
#include <iostream> #include <queue> using namespace std; struct Node{ int x, y; }node; struct cmp{ bool operator()(Node a,Node b){ if(a.x==b.x) return a.y>b.y; return a.x>b.x;} }; int main(){ priority_queue<Node,vector<Node>,cmp>q; for(int i=0;i<10;i++){ node.x=i; node.y=10-i/2; q.push(node); } while(!q.empty()){ cout<<q.top().x<<' '<<q.top().y<<endl; q.pop(); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解