这个类有严格弱排序吗?
Would this class have a Strict Weak Ordering
本文关键字:排序 更新时间:2023-10-16
假设我有class/struct Foo
struct Foo {
int a, b;
bool operator< (Foo const& r){
return a < r.a;
}
bool operator== (Foo const& r){
return a==r.a&&b==r.b;
}
};
Foo bar = { 5, 1 };
Foo baz = { 5, 2 };
现在bar == baz
是假的,bar < baz
和baz < bar
也是假的。
请注意,这里的排序完全忽略了b
,但b
是相等关系的一部分。
技术上是的,您直接通过 然而,在同一个类上定义两个隐含不同含义的操作符是一个坏主意,因为这可能会使该类的用户感到困惑。据我所知,它不会直接破坏任何STL容器,因为它们只使用两个操作符中的一个,但它肯定会让我感到困惑,你可以有这种情况!巴兹)和(巴兹<(Bar == baz).a
成员订购它们,这对于例如应该是好的。std::set
。基本上它们表现得像整数,即。如果
根据维基百科关于严格弱排序的条目,它具有以下属性:
您的类的
- 对于所有x, x
- 对于所有x≠y,如果x <那么就不是Y><x(不对称)。>那么就不是Y>
- 对于所有x, y和z,如果x
<z(传递性)。> - 对于所有x, y和z,如果x与y不可比较,则y是与z不可比,则x与z不可比(的及物性)等价)。
operator<
满足所有这些属性,并且它本身就足以限定为具有严格的弱排序,因为根据定义所需的二进制关系是<
,而不是==
。
然而,正如Peter在他的回答中提到的,定义operator==
时考虑到一个额外的成员变量可能会导致不直观的结果,这可能会使您的类的用户感到困惑。
类本身没有弱排序。严格弱序是二进制函数,如operator<(Foo, Foo)
。一旦意识到这一点,就很明显为什么函数F
不能影响函数G
是否是SWO了——它是G
的一个独立属性。这就是operator==
不能影响operator<
是否是SWO的原因。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 如何在C++中对数组进行冒泡排序