STL,greater,operator >()的参数,及其他

yaoyansi 2009-01-09 10:34:16
问题背景:
class Test
{
int key;
}
priority_queue<Test, vector<Test>, greater> myqueue;

//非成员函数
bool operator == (const Test& l, const Test& r)
bool operator > (const Test& l, const Test& r)
bool operator < (const Test& l, const Test& r)
bool operator >= (const Test& l, const Test& r)
bool operator <= (const Test& l, const Test& r)

问题:
1.我用的是greater,是不是只需要重载operator > ?
2.如果我需要表达"大于等于",那么priority_queue<Test, vector<Test>, greater>里的"greater"应该换成什么?
3.如果我需要表达"大于等于",是重载 >= 呢?还是同时重载"> "和 "==" ?
4.对于这些比较符,是应该写成成员函数, 还是全局函数?

5.如果定义:
priority_queue<Test*, vector<Test*>, greater> myqueue2;
那么对于运算符的重载,参数应该采用下列哪一种?或者是其它的?
a) bool operator XX (const Test* l, const Test* r)
b) bool operator XX (const Test* & l, const Test* & r)

6.这种类似的问题,我应该看什么书?

请高手指点一下,谢谢.
...全文
495 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hai040 2009-01-09
  • 打赏
  • 举报
回复
1.最好是全部重载,不是很清楚greater是不是一定就用>实现
只需要实现==/<,其它的都可以用这两个导出
2.不能用大于等于,这类排序a op b/b op a不成同时为真
如果需要特殊的顺序,greater可以换成自己写的函数对象
3.>=
4.全局
5.一般用a,对象用引用的原因是为了避免复制
6.想直接查答案的话就上网查,想学的话看基础,觉得lz的基础还是有问题
星羽 2009-01-09
  • 打赏
  • 举报
回复


问题:
1.我用的是greater,是不是只需要重载operator > ?

是的


2.如果我需要表达"大于等于",那么priority_queue <Test, vector <Test>, greater>里的"greater"应该换成什么?

greater_equal<Test>


3.如果我需要表达"大于等于",是重载 >= 呢?还是同时重载"> "和 "==" ?

只要重载 >+


4.对于这些比较符,是应该写成成员函数, 还是全局函数?

都可以,不过注意如果写成成员记得要定义为 const 函数


5.如果定义:
priority_queue <Test*, vector <Test*>, greater> myqueue2;
那么对于运算符的重载,参数应该采用下列哪一种?或者是其它的?
a) bool operator XX (const Test* l, const Test* r)
b) bool operator XX (const Test* & l, const Test* & r)

a, b 都不行

自己写比较

#include "iostream"
#include "queue"
#include "functional"
using namespace std;

class Test
{
public :
Test()
{

}

Test(int k) : key(k)
{

}

int key;
};

struct greater2
: public binary_function<Test*, Test*, bool>
{
bool operator()(Test* const& _Left, const Test* const& _Right) const
{
return (_Left->key > _Right->key);
}
};


int main()
{
priority_queue <Test*, vector <Test*>, greater2> myqueue;
myqueue.push(new Test(1));
myqueue.push(new Test(2));

return 0;
}

zdeepblue 2009-01-09
  • 打赏
  • 举报
回复
使用成员或非成员函数都可以。
只是个人觉得,这里用成员函数清晰些,呵呵。

// declaration in class
bool operator < (Test const & rhs) const;

zdeepblue 2009-01-09
  • 打赏
  • 举报
回复
其实,只要重载<
因为,a>b 等价于 b<a ; a==b 等价于 !(a<b)&&!(b<a)
可以看一下《数据结构和算法分析(C++)》
herman~~ 2009-01-09
  • 打赏
  • 举报
回复
MARK
pclili 2009-01-09
  • 打赏
  • 举报
回复
你把这代码放以编译器里一编译结果就出来了.比谁都明白.
我觉得什么书也不用看.
直接写完代码编译.多试几次,比看什么书都印像深刻!!!
fancy_zhh 2009-01-09
  • 打赏
  • 举报
回复
mark
xiaoyisnail 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
1.最好是全部重载,不是很清楚greater是不是一定就用>实现
只需要实现==/ <,其它的都可以用这两个导出
2.不能用大于等于,这类排序a op b/b op a不成同时为真
如果需要特殊的顺序,greater可以换成自己写的函数对象
3.>=
4.全局
5.一般用a,对象用引用的原因是为了避免复制
6.想直接查答案的话就上网查,想学的话看基础,觉得lz的基础还是有问题
[/Quote]

up

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧