在Nicolai M. Josuttis撰写的“C++ Standard Library”(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节)
为什么第一个不正确?我认为,如果两个值都不相等,则两个值相等,这就是第一个代码段显示的内容。为什么即使使用算子==来测试第二个是否正确,但这是对相等性而非对等性的检验?
ps。第二版在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(第1版和第2版),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56451984/