Josuttis书中的PersonSortCriterion(第1版和第2版)

时间:2019-06-04 22:11:09

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

在Nicolai M. Josuttis撰写的“ C ++标准库”(2002年12月第10版)中,第8.1.1节“将函数对象作为排序标准”具有具有返回语句的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 ==也是对相等性的检验,而不是对等性的检验?

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

1 个答案:

答案 0 :(得分:0)

似乎两者都做同样的事情,但是第二版更具可读性。

注意

!(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()