priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。下面给出priority_queue的函数列表和priority_queue的使用代码,本文中与heap有关的函数参见《STL系列之四 heap 堆》。
函数 | 描述 |
---|---|
priority_queue c | 创建一个空的queue 注:priority_queue构造函数有7个版本 |
priority_queue | Type为数据类型,Container为保存数据的容器,Functional为元素比较方式。如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。 |
c.top() | 返回队列头部数据 |
c.push(elem) | 队列尾部增加elem数据 |
c.empty() | 判断队列是否为空 |
c.size() | 队列中元素的个数 |
使用列子:
有5个同学随意入队;他们都有成绩和姓名;请按照成绩从低到高出队列,如果成绩相等,按照名字字母逆顺序出队;
class Student{
private:
std::string name;
short score;
public:
Student():name(""),score(0){}
Student(std::string name,short score):name(name),score(score){}
short get_score() const{
return score;
}
std::string get_name() const{
return name;
}
};
class CompareFun{
public:
bool operator() (const Student &lf,const Student &rg) const {
if (lf.get_score() == rg.get_score()){
return lf.get_name() < rg.get_name(); //返回1的时机?后面的大,返回1,进行调整;把大的调整到前面
}
return lf.get_score() > rg.get_score();//左边大于右边,返回1;入队时,之前入队的元素大于后入队的,返回1,进行调整;
}
};
void priority_queue_use(){
//下面是使用优先级队列的常见形式
std::priority_queue<Student,std::vector<Student>,CompareFun> qu_test;
Student s1("wang",60);
Student s2("wei",60);
Student s3("song",54);
Student s4("ni",76);
Student s5("havy",80);
qu_test.push(s1);
qu_test.push(s2);
qu_test.push(s3);
qu_test.push(s4);
qu_test.push(s5);
std::cout << "score \t name " <<std::endl;
while(!qu_test.empty()){
std::cout << qu_test.top().get_score() << "\t"
<<qu_test.top().get_name() <<std::endl;
qu_test.pop();
}
}