C++ 比较器两种实现方式的差异
我的代码中有一个名为edge的对象类,它需要定义操作符<来对对象进行排序。我用两种方式定义它,一种方式有效,另一种方式只给出运行时错误(分段错误)。我想知道这东西是怎么工作的?我使用std::sort是出于我的目的C++ 比较器两种实现方式的差异,c++,sorting,comparator,C++,Sorting,Comparator,我的代码中有一个名为edge的对象类,它需要定义操作符
struct edge{
int u;
int v;
int w;
edge(int a, int b, int c) : u(a), v(b), w(c){}
bool operator<(const edge &other) const{
return (w <= other.w);
}
};
struct-edge{
国际大学;
INTV;
int w;
边(inta,intb,intc):u(a),v(b),w(c){}
布尔运算符运算符您违反了严格弱排序的两个要求:
您违反这些要求会导致未定义的行为。
(这些称为不可伸缩性和不对称性。)
第三个要求是及物性
- 如果
a
在b
之前排序,并且b
在c
之前排序,则a
在c
之前排序
这三个是“严格弱序”的“严格”部分
“薄弱”部分是,给定a
和b
,一个不一定是在另一个之前排序的(这不是要求您必须拥有a
或b
)。
两个元素a
和b
,其中两个元素的顺序都不相同
请注意,std::sort
,与快速排序一样,是不稳定的;等价但不同的元素在结果中的顺序不一定与它们在输入中的顺序相同。请发帖。运行时错误可能是在此处未显示的特定上下文中造成的。std::sort
(因为我假设这就是您的意思),需要严格的弱排序。您的第一个实现不满足该要求。需要一个比较器来实现严格的弱排序。如果不满足,则与标准库算法(如std::sort()
和许多其他算法)一起使用,结果是未定义的行为。由于它使用了Thank@Peter,我不知道它是未定义的行为。我已经使用它这么久了,没有给我任何问题,今天是我第一次看到这个问题。@TarunGupta试着站在你面前看看结果如何。我只是好奇为什么排序算法(类似于快速排序,如果我假设正确的话)需要严格的弱排序,否则它也应该工作。@TarunGupta为什么你认为“它也应该工作?”?如果有一些代码需要一个特定的顺序,并在其算法中使用它,那么当给出一个不同的顺序,特别是一个不小于关系的顺序时,为什么应该期望它工作?@LightnessRacesinOrbit如果我们看到快速排序算法,特别是它选择一个轴,然后它只是递归地部分对于不需要严格排序的数组进行排序。那么,我想,我假设它是完全错误的。@TarunGupta可能存在一些算法,您的实现是有效的。但是您忘了在问题中告诉我们您正在运行什么算法,所以我们只能笼统地回答。@TarunGupta Quicksort不支持分为元素
struct edge{
int u;
int v;
int w;
edge(int a, int b, int c) : u(a), v(b), w(c){}
bool operator<(const edge &other) const{
return (w < other.w);
}
};
bool operator<(const edge &other) const{
return (w <= other.w);
}