运算符重载在 CPP 中的排序中如何工作?

how operator overloading works in sorting in cpp?

本文关键字:工作 何工作 排序 重载 CPP 运算符      更新时间:2023-10-16

我知道用于排序的比较器,我知道comp(x,y)应该 返回 true 以获取订单 ..,x ,....,y..在向量中。

bool comp(int x,int y){
return occurences[x]<occurences[y];
}

sort(data.begin(),data.end(),cmp); 根据 x 将后跟向量中的 y (...x.y..)

但最近我了解了 使用运算符重载的同样的事情,我对此有一些怀疑。

struct Edge{
int u,v,weight;
bool operator < (Edge const& other){
return weight < other.weight;
}
}

1)它会以同样的方式工作吗?就像这里,如果当前边缘权重

2)哪个会先来,我的意思是上面格式的 comp(x,y) 返回 true 那么x将首先出现 但是这里的标准是什么,因为似乎我们 在运算符重载函数中仅传递参数。 就像如果我们比较 Edge1(权重 = 40)

当声明一个类的成员函数时,有一个"不可见"的第一个参数this

所以在类之外,函数看起来像这样:

bool operator < (const Edge* this, Edge const& other)
{ return this->weight < other.weight; }

所以左(第一个)变量总是this,右(第二个)变量是other

另一种看待方式就像阿空加瓜建议的那样:

表达式x < y映射到Edge x, y; x.operator<(y);– 这是显式调用运算符。

有关运算符重载的更多详细信息:运算符重载的基本规则和习语是什么?

如果您不给std::sort一个自定义比较器,那么范围将通过使用operator<比较元素来排序。

从逻辑上讲,两个版本的std::sort之间只有单行差异:

if (obj1 < obj2) {

if (cmp(obj1, obj2)) {

在这两种情况下,对象都将被排序,对于任何对象obj1排序在另一个对象obj2之前,比较将返回true