我知道排序的比较器,我知道comp(x,y)应该 返回true以在向量中获得订单..,x,....,y..。
bool comp(int x,int y){
return occurences[x]<occurences[y];
}
sort(data.begin(),data.end(),cmp); 根据x将在向量(... x..y ..)中跟随y
但是最近我开始了解 关于操作符重载,我也有一些疑问。
struct Edge{
int u,v,weight;
bool operator < (Edge const& other){
return weight < other.weight;
}
}
1)它会以相同的方式工作吗?如当前边缘权重一样
2)这将是第一个,我的意思是上面上面的格式comp(x,y)返回true
然后x会优先出现但是这里的标准是什么,因为似乎我们
在运算符重载函数中仅在此处传递参数。
就像我们比较Edge1(weight = 40)
答案 0 :(得分:1)
在声明类的成员函数时,有一个“不可见”的第一个参数:this
因此,在类外,该函数类似于:
bool operator < (const Edge* this, Edge const& other)
{ return this->weight < other.weight; }
因此,左(第一)变量始终为this
,右(第二)变量始终为other
。
另一种看待方式是阿空加瓜建议:
表达式x < y
映射到Edge x, y; x.operator<(y);
–这是显式调用运算符。
有关运算符重载的更多详细信息:What are the basic rules and idioms for operator overloading?
答案 1 :(得分:0)
如果您没有为std::sort
提供自定义比较器,则将通过使用operator<
比较元素来对范围进行排序。
从逻辑上讲,std::sort
的两个版本之间仅存在单行差异:
if (obj1 < obj2) {
vs
if (cmp(obj1, obj2)) {
在这两种情况下,将对对象进行排序,以便对于在另一个对象obj1
之前排序的任何对象obj2
,比较将返回true
。