今天使用stl的优先队列的时候,发现原来自己并不怎么会用,就只会在有基础数据类型的时候知道
怎么用,一有结构体或者类,就不知道怎么使用。于是摸索摸索,就写了这篇东西。
一般的用法都是
priority_queue priq;
priq.push(5);
这样就可以了。
可是有结构体的时候,就需要看下优先队列原本是怎么制定的,以下是其构造函数。
from:http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/
explicit priority_queue ( const Compare& x = Compare(),
const Container& y = Container() );
template
priority_queue ( InputIterator first, InputIterator last,
const Compare& x = Compare(),
const Container& y = Container() );
我们可以设定priority_queue<user, vector, cmp> q。
第一个参数user是一个结构体,它是一个用来做compare的数据类型,
第二个要是一个容器。原本两个参数就足够了,但其实还不足以,我们需要自己定制一个比较函数。这里是需要
通过重载()来实现的。至于why,暂时没搞明白,毕竟在这里是说怎么用,而不是讲它怎么来的。
struct user {
user(){}
user(char n[], int c) {
strcpy(name, n);
cnt = c;
}
char name[15];
int num;
};
//设置多个比较函数的时候需要这样写,因为需要区分嘛,如果只构造一种优先队列的话,直接写重载()就好了,如下,就不用写到类里面。
/*
bool operator()(const user a,const user b) const
{
return a.cnt > b.cnt;
}
*/
class mincmp {
public:
bool operator()(const user a,const user b) const
{
return a.cnt > b.cnt;
}
};
int main()
{
//按自己制定的比较函数,最小的在队列的开头
priority_queue<user, vector
, mincmp> minq;
minq.push(user("bob",5));
minq.push(user("alice",7));
cout << minq.top().name << endl; //bob
return 0;
}