关于这两个函数是否具有相同逻辑的另一个问题似乎存在一些分歧:
bool operator<(const screenPoint& left, const screenPoint& right){
if (left.x < right.x) return true;
else return left.y < right.y;
}
bool operator<(const screenPoint& left, const screenPoint& right){
return left.x < right.x || left.y < right.y;
}
Run Code Online (Sandbox Code Playgroud)
我已经盯着这些看了很长一段时间,我看不出它们会有什么不同的表现.在两者中,如果left.x < right.x
,他们都返回true
.如果没有,那么他们都返回结果left.y < right.y
.对?
如果没有,有人可以详细说明.
另外,有人提出,其中第一个与词法排序的实现相同std::tie
,是真的吗?
这两个是相同的(如果你在第一个中修复了缺少的括号if
),但它们没有实现严格的弱排序,所以你可能不想使用它们(在标准的有序中使用它们是无效的)容器和算法).
证明:考虑a =(1,3)b =(2,2)的原始关系.然后a <b和b <a.(违反不对称财产)
正确的词典排序看起来像这样:
bool operator<(const screenPoint& left, const screenPoint& right){
if (left.x < right.x)
return true;
if (left.x > right.x)
return false;
return left.y < right.y;
}
Run Code Online (Sandbox Code Playgroud)
如果您的成员只有<
操作员而不是>
操作员,请替换left.x > right.x
为!(right.x < left.x)
.这就是字典比较的实现方式std::pair
和std::tuple
(由其返回std::tie
).