关于C++ STL中的priority_queue的使用
优先队列是一种比较常用的结构,虽然被称为队列,但却不是队列。这里的队列我猜测是源自于操作系统中的概念。操作系统负责管理计算机的资源并且负责调配,而对cpu计算时间资源的调配是一个比较核心的问题,线程是cpu资源调度的最小单元,通常每一个线程都会绑定一个优先级的,在操作系统复杂的调度机制中,有这么一小块场景中决定哪一个线程使用cpu资源是有优先级决定的,这样操作系统就需要维护一个优先级相关的队列,这里把它命令为队列,我猜想是因为这些线线都在排队等待cpu资源,所以在这个场景里把它叫做队列,而实际上实现起来,它的逻辑结构是一棵树,可以用二叉堆来实现。
priority_queue is a simple data structure.因为它支持的操作极少,它的核心操作是支持在常量时间内获得最优先的元素。priority_queue支持push, pop, top这三个核心的操作。其实对于C++程序员来说,priority_queue还是比较容易理解的,唯一的难点就在于如何构造优先队列,更具体的说,这里的难点是如何使用自己定义的结构作为优先队列中的元素。如果是C++的基本数据类型,那是十足的简单,如果自己定义一个数据结构不管是使用类还是使用结构体,如何把自定义的结构套入到当前的优先队列模板中,在使用上这是priority_queue唯一能称的上有点难度的难点。下面分享一下我的收获,虽然还没有对STL中优先队列的底层实现有多少了解,但是想要研究一个事物,第一次是认识这个事物,首先要学会至少一种解决问题的方法,然后再滚雪球,这就是积累,这是克服望而生畏,积极动手实践的好方法。不管怎样,先解决问题,再步步优化。哟~,没完没了了。下面贴一下代码,你自己也可以动手写一下:
#include <iostream> #include <queue> using namespace std; struct node{ int idx; int key; node(int a=0, int b=0):idx(a), key(b){} }; struct cmp{ bool operator()(node a, node b){ return a.key > b.key; } }; int main(){ priority_queue<node, vector<node>, cmp> q; int i; for(i=0;i<10;++i){ q.push(node(i, i)); } while(!q.empty()){ cout<<q.top().key<<endl; q.pop(); } return 0; }
以上我自己定义了一个结构,并且定义了一个cmp的结构用于实现自定义的比较方法。比较函数有两个参数a和b,很长时间都没有理解这里的比较函数的工作原理,到底这里返回
a>b和a<b的结果到底是什么?最后,我想到了一个场景来记忆这里的比较函数的意义:a,b是该数据结构中前后两个元素,如果返回true,这两个元素就需要交换位置,反之则不需要。这样一想,和它实际的作用是对应的,我猜想我这么想正确一定是有原因的,或许底层实现的时候,设计者就是这么定义的,嘿嘿,到时候研究的时候就知道了,现在可以这么想,如果你也记不住的话。