条款21: 永远让比较函数对相等的值返回false
让我向你展示一些比较酷的东西。建立一个set,比较类型用less_equal,然后插入一个10:
set<int, less_equal<int> > s; // s以“<=”排序 s.insert(10); // 插入10
现在尝试再插入一次10:
s.insert(10);
对于这个insert的调用,set必须先要判断出10是否已经位于其中了。 我们知道它是,但set可是木头木脑的,它必须执行检查。为了便于弄明白发生了什么,我们将一开始已经在set中的10称为10A,而正试图插入的那个10叫10B。
set遍历它的内部数据结构以查找哪儿适合插入10B。最终,它总要检查10B是否与10A相同。关联容器对“相同”的定义是等价(equivalence)(参见条款19),因此set测试10B是否等价于10A。当执行这个测试时,它自然是使用set的比较函数。在这一例子里,是operator<=,因为我们指定set的比较函数为less_equal,而less_equal意思就是operator<=。于是,set将计算这个表达式是否为真:
!(10A <= 10B) && !(10B <= 10A) // 测试10A和10B是否等价
哦,10A和10B都是10,因此,10A <= 10B 肯定为真。同样清楚的是,10B <= 10A。于是上述的表达式简化为
!(true) && !(true)
再简化就是
fa