前段时间做项目时,遇到自定义优先级的优先队列问题,偶偶发现点问题,通过网友的解答和自己的理解明白了一些路路,小结一下:
1、若是定义值类型对象,如:
- int main()
- {
- priority_queue<node> qn;
- node n1;
- n1.a = 9;
- node n2;
- n2.a = 2;
- node n3;
- n3.a = 50;
- qn.push(n1);
- qn.push(n2);
- qn.push(n3);
- int size = qn.size();
- for(int i = 0; i < size; i++)
- {
- cout << qn.top().a << endl;
- qn.pop();
- }
- return 0;
- }
则定义优先级的时候,直接在类中写个friend 的操作符重载函数即可:
- class node
- {
- public:
- int a;
- node(){}
- node(int x):a(x){}
- friend bool operator<(const node ne1,const node ne2)//参数也可以为引用,值传递
- {
- if(ne1.a > ne2.a)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- };
其中在c++primer第三版 中文版中关于操作符重载有如下描述:
"程序员只能为类类型或枚举类型的操作数定义重载操作符我们可以这样来实现把重
载操作符声明为类的成员或者声明为名字空间成员同时至少有一个类或枚举类型的参数
按值传递或按引用传递"
因此不可用指针类型的参数;
2、如果想定义一个指针类型的优先队列,那就不可这么简单的定义了,你需要自定义一个自己的比较函数,在priority_queue的模板函数中,我们可以利用这样一个template<class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type> >模板,在我们的程序代码中,则需要自己定义一个类来定义第三个模板参数,如:
- class nodePointerComparer
- {
- public:
- nodePointerComparer(){}
- bool operator ()(const node* ne1, const node* ne2) const
- {
- return ne1->lessthan(ne2);
- }
- };
当然在这之前我们的类Node要重新书写:
- class node
- {
- public:
- int a;
- node(){}
- node(int x):a(x){}
- bool lessthan(const node* pnode) const
- {
- return a < pnode->a;
- }
- };
这样在main函数中就可以定义指针类型的优先队列了:
- int main()
- {
- priority_queue <node*, vector <node*>, nodePointerComparer> qn;
- node *n1 = new node(90);
- node *n2 = new node(2);
- node *n3 = new node(50);
- qn.push(n1);
- qn.push(n2);
- qn.push(n3);
- int size = qn.size();
- for(int i = 0; i < size; i++)
- {
- cout << qn.top()->a << endl;
- qn.pop();
- }
- return 0;
- }
疑问之处:如果你使用第一种值传递的操作符重载,来实现第二种的指针类型优先队列,是不会达到想要的结果的,个人理解是因为在指针类型的优先队列中找“<”运算符的时候,重载的不是我们写的值传递friend bool operator<(const node ne1,const node ne2)//
也就是没有找到指针类型的"<"重载,所有不会达到优先队列的效果。
最后的一段为个人理解,有错误之处,还请路过的同仁指教。