自定义优先队列和操作符重载问题
来源:互联网 发布:ppt 数据计算展示图 编辑:程序博客网 时间:2024/06/03 11:13
前段时间做项目时,遇到自定义优先级的优先队列问题,偶偶发现点问题,通过网友的解答和自己的理解明白了一些路路,小结一下:
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)//
也就是没有找到指针类型的"<"重载,所有不会达到优先队列的效果。
最后的一段为个人理解,有错误之处,还请路过的同仁指教。
- 自定义优先队列和操作符重载问题
- 优先队列中重载运算符>和<
- 《优先队列》使用及操作符重载——C++
- 优先队列比较符重载
- 优先队列运算符重载
- 关于stl优先队列重载小于运算符的问题
- 优先队列——重载运算符
- 优先队列 重载运算符详解
- 模板类中操作符重载问题("<<"和">>"重载)
- 模板类中操作符重载问题("<<"和">>"重载)
- 优先队列priority_queue(重载)
- 优先队列之重载运算
- 优先队列的重载方式。
- 优先队列重载(理解)
- 优先队列 自定义优先级
- 自定义优先队列
- 队列和优先队列
- 操作符重载问题
- 判断endian的小程序
- 网络编程遇到的一个Link错误
- ps状态说明
- 找不到DLL入口点
- 扩展Struts2--自定义String和XML格式的Result
- 自定义优先队列和操作符重载问题
- OpenCV学习笔记(一)概述和系统配置
- (转载)在MFC扩展DLL中输出对话框
- Embed Object大部分的属性及参数详解
- 开篇
- WordPress 2.6.1 SQL Column Truncation Vulnerability分析
- 各种数据库连接
- Google的博客blogspot.com窃取cookie漏洞
- Oblog最新注入漏洞分析