这两个比较表达式是否相同?

Jer*_*dge 3 c++

关于这两个函数是否具有相同逻辑的另一个问题似乎存在一些分歧:

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,是真的吗?

int*_*jay 6

这两个是相同的(如果你在第一个中修复了缺少的括号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::pairstd::tuple(由其返回std::tie).