运算符重载如何在cpp中排序?

时间:2019-06-12 07:19:30

标签: c++ sorting operator-overloading

我知道排序的比较器,我知道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)

2 个答案:

答案 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