1

我对C++ 标准库中的代码段有疑问。我的问题是这!(p2.lastname() < p1.lastname())似乎没有必要,因为我认为条件代表姓氏在 p1 和 p2 中等效。如果我删除了条件,代码似乎可以正常工作。我看到了这种严格的弱排序。我阅读了相关文章,但我并没有完全理解这个概念。你能解释一下为什么需要这个条件吗?

class Person {
public:
  string firstname() const;
  string lastname() const;
};

class PersonSortCriterion {
public:
  bool operator() (const Person& p1, const Person& p2) const {
    // 1) Compare the lastnames.
    // 2) If the lastnames are equivalent, compare the firstnames.
    return p1.lastname() < p2.lastname() ||
       (!(p2.lastname() < p1.lastname()) &&
          p1.firstname() < p2.firstname());
  }
};
4

1 回答 1

3

所以我认为你是说以下是可以的

return p1.lastname() < p2.lastname() ||
      p1.firstname() < p2.firstname());

但这是不正确的。考虑两个人“Andy Zerkis”和“Zebedee Archer”。使用上面的代码 AZ < ZA 和 ZA < AZ。所以两个名字都比另一个少。毫不奇怪,这会混淆排序算法。另一种说法是上面的代码没有强加严格的弱排序。特别是它打破了这样的规则,即 x < y 和 y < x 都为真。

如果您不熟悉严格的弱排序,它似乎会让人感到困惑,但实际上它只是说明了您对任何排序标准所期望的显而易见的事情。

于 2020-04-29T09:02:14.157 回答