提问人:Radu C 提问时间:2/16/2019 更新时间:2/17/2019 访问量:113
为什么 std::rel_ops 需要相等运算符?
Why does std::rel_ops need equality operator?
答:
为什么rel_ops需要平等?“<”还不够吗?
a==b => !(a<b) && !(b<a)
因为这在一般情况下是不正确的。如果只适用于遵循该逻辑的关系运算符,那么它将受到相当大的限制。rel_ops
我猜你想到的是关联容器的运算符所需的弱排序。来自 cppreference:<
在标准库使用“比较”要求的任何地方, 唯一性是通过使用等价关系来确定的。在 不精确的术语,两个对象 a 和 b 被认为是等价的(不是 unique),如果两者都不比另一个少:!comp(a, b) && !comp(b, a)。
简单来说:两个密钥是否被认为是“相同”的,只能通过要求来确定。因此,您只需要为关联容器提供 a,而不需要来决定两个键是否相同。但是,等价 () 不一定等同于 ()。! (a < b) && ! (b < a)
<
operator==
!(a<b)&&!(b<a)
a==b
例如,当您使用此
struct my_key {
int a;
int b;
bool operator< (const key_type& other) {
return a < other.a; // not comparing b !
}
};
作为 then 和 are 等价的键(“同一键”),即使它们不相等。再举一个例子,考虑一个球面坐标,我们选择在哪个球面坐标中,当时间更接近原点时:std::map
my_key{1,0}
my_key{1,2}
Point
a < b
a
b
struct Point {
double radius;
double angle;
bool operator<(const Point& other) {
return radius < other.radius;
}
bool operator==(const Point& other) {
return (radius == other.radius) && (angle == other.angle);
}
}
这里也有三个,并且可以同时是错误的。a < b
b < a
a == b
另请注意(来自 cppreference)
自 C++20 起,不推荐使用 std::rel_ops,取而代之的是 operator<=>。
对于星际飞船操作员<=>
您可以选择
std::strong_ordering
std::weak_ordering
std::partial_ordering
std::strong_equality
std::weak_equality
弱排序是必需的,例如(例如或),而对于强排序,等价和相等基本相同。有关更多详细信息和示例,我建议您参考此。std::map
my_key
Point
评论
是的,实际上你错过了。这是非常基本的。它与C++或编程无关。这是关于数学的。根据数学,当且仅当“<”在其操作数域上定义了严格的弱排序时,您的陈述才为真。并非每个具有“less”rel_op的用户定义类型都具有弱排序。
评论
NaN
NaN
std::map
<=> != ==
,我没有订购这个!为什么它出现在我的账单上?和博客(对 <=> 的改进)。作为参考,已经因此而更改。rel_ops
<=>
<=>