c++ - Josuttis 书中的 PersonSortCriterion(第一版与第二版)

标签 c++ c++-standard-library

在 Nicolai M. Josuttis 的“The C++ Standard Library”(2002 年 12 月第 10 次打印)中,第 8.1.1 节“作为排序标准的函数对象”包含带有 return 语句的 operator():

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

根据我对等价的理解,这是正确的。但是同一本书的第二版(2012 年出版)将其更改为:

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

它混合使用了等价和相等。第一版的勘误表确认第二版是正确的:http://www.josuttis.com/libbook/errata1_05.html (参见第 295 页,第 8.1.1 节)

为什么第一个不正确?对于等价性,我认为如果两个值都不先于另一个,这就是第一个代码片段显示的值,那么这两个值是等价的。为什么第二个是正确的,即使它使用了 operator== 来测试相等性,而不是等价性?

附言。第二版在第 10.1.1 节中有此内容,章节标题与第一版相同。

最佳答案

看起来两者做同样的事情,但第二个版本更具可读性。

注意

!(p2.lastname()<p1.lastname()) 

可以写成

!(p1.lastname() > p2.lastname())

相同
p1.lastname() <= p2.lastname()

因为我们已经处理了这个案子p1.lastname()<p2.lastname()在第一行(如果 p1.lastname()<p2.lastname()true,则永远不会评估第二行),第二行基本上归结为

p1.lastname() == p2.lastname()

关于c++ - Josuttis 书中的 PersonSortCriterion(第一版与第二版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56451984/

相关文章:

c++ - 为什么我不能用 optional<S> 构造 optional<T> (对于 S!=T)?

c++ - 在 std::accumulate 中使用变异函数

c++ - GCC libstdc++ 配置文件模式的替代方案

c++ - 为什么我们使用 enable_shared_from_this 模板?

c++ - piping stockfish 在 fedora 中行为不端

c++ - 非法使用未定义类型

android - 我可以使用 C 或 C++ 创建 APK 吗?

c++ - 如何测试标准库中是否定义了 std::remove_cvref?

C++ 模板变量和参数包扩展

c++ - LPTSTR 开头的奇怪字符? C++