运算符重载在 CPP 中的排序中如何工作?
how operator overloading works in sorting in cpp?
我知道用于排序的比较器,我知道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
。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个