例如:在 C++ 头文件中,如果我定义了 struct Record
我想将它用于可能的排序,以便我想重载 less operator
.以下是我在各种代码中注意到的三种方式。我大致注意到:如果我要输入 Record
变成 std::set
, map
, priority_queue
, ... 容器,版本 2 可以工作(可能版本 3 也是如此);如果我要保存 Record
变成 vector<Record> v
然后调用make_heap(v.begin(), v.end())
等等。那么只有版本 1 有效。
struct Record
{
char c;
int num;
//version 1
bool operator <(const Record& rhs)
{
return this->num>rhs.num;
}
//version 2
friend bool operator <(const Record& lhs, const Record& rhs) //friend claim has to be here
{
return lhs->num>rhs->num;
}
};
在同一个头文件中例如:
//version 3
inline bool operator <(const Record& lhs, const Record& rhs)
{
return lhs->num>rhs->num;
}
基本上,我想在这里提出问题,看看是否有人可以总结一下这三种方法之间的区别以及每个版本的正确位置是什么?
最佳答案
它们本质上是相同的,除了第一个是非常量并且允许您修改自身。
我更喜欢第二个原因有两个:
- 不一定是
friend
。 lhs
不必是Record
关于c++ less 运算符重载,用什么方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016880/