C++ 对的全局不等式比较<&燃气轮机;在C++;标准

C++ 对的全局不等式比较<&燃气轮机;在C++;标准,c++,math,comparison,standards,std-pair,C++,Math,Comparison,Standards,Std Pair,根据: 在不等式比较()中,比较第一个元素 首先,而且只有在不平等性比较对他们不成立的情况下 第二个元素进行了比较 也就是说: return ((a.first < b.first) || (!(b.first < a.first) && (a.second < b.second))); return((a.first

根据:

在不等式比较()中,比较第一个元素 首先,而且只有在不平等性比较对他们不成立的情况下 第二个元素进行了比较

也就是说:

return ((a.first < b.first) || (!(b.first < a.first) && (a.second < b.second)));
return((a.first
我的问题是,为什么它如此不直观?背后的原因是什么?有没有这样的例子可以证明这个推理是正确的

我认为实施的方式很简单:

return a.first < b.first && a.second < b.second
返回a.first
如果
a.first
小于
b.first
,则该对已较小。没有理由比较第二部分。成对的词按其第一部分进行隐式排序,就像名字按其第一个字母进行排序一样。“苹果”排在“斑马”之前,因为“A”排在“Z”之前,所以我们根本不比较“p”和“e”

所以如果a.first,我们就完成了。然而,如果没有,我们还没有完成。还有另一种方法
a
可以小于
b
。如果
b.first
不是这种情况,
a.second

可以用“斑马”和“齐曼”来比喻。“Z”不小于“Z”,但“e”小于“y”,所以第一个小于第二个

您有时会看到它是这样编码的:

bool operator<(const foo& a, const foo& b) {
 if (a.first < b.first) return true;
 if (a.first > b.first) return false;
 return (a.second < b.second);
}
bool操作符b.first)返回false;
返回(a.second

我发现直观上更容易理解,但逻辑是一样的:

这种比较称为a,是将两种不同的顺序组合成一种更自然的方式之一

< > C++中要求的顺序调用。这意味着以下情况应该是正确的:

  • 不可伸缩性:x
  • 及物性:如果x
  • 反对称性:如果x
  • 等价的传递性:如果x和y不可比,y和z不可比,那么x和z不可比
这些属性是您需要的,以保证您可以获取对象列表并将它们按升序排序。这意味着您可以对它们使用
std::sort
,或者将它们存储在
std::set

你可以用一点数学证明,如果你有两个不同的严格弱序,那么你通过将它们组合为
std::pair
得到的字典顺序也是严格弱序。词典排序是可以组合严格弱排序以生成新的严格弱排序的少数几种方法之一

但是,您建议的排序是而不是严格的弱排序,并且会导致某些假设被打破。特别地,考虑对(0, 5)、(3, 3)和(1, 6)。(0,5)与(3,3)不可比,(3,3)与(1,6)不可比。然而,我们确实有(0,5)<(1,6),这打破了等价的及物性规则。因此,许多假定等价性是可传递的排序算法(包括大多数主要的排序算法)在您的范围内无法正常工作,这意味着
std::sort
可能表现不正确。这还意味着您也不能将它们存储在
std::set
中,因为
std::set
以某种排序顺序(通常是平衡的二进制搜索树)内部存储所有内容,您可能会得到完全错误的结果


希望这有帮助

直觉在旁观者的眼中。事实上,我自己也觉得这很直观


它的行为就像您在比较其他序列时所做的一样。例如,您会说字符串
“az”
位于
“ba”
之前,对吗?但是您没有
'a'<'b'&&&z'<'a'
!同样的推理也适用于配对。它不仅更加直观,而且还保持了这种关系的所有可取特性。

正是我所寻求的解释(+1)很好的解释,补充了上述答案(+1)