STL

《Effective STL》

21《总是让比较函数在等值情况下返回false》

Posted by Liangjf on April 9, 2019

条目二十一《总是让比较函数在等值情况下返回false》

这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的。

对于关联容器来说,比较是等价比较,所以要注意等值的时候,比较子的返回值。

关联容器的find、insert等都是通过等价来判断元素是否已存在的。

注意关联容器的等价表达式if(!(except1)&&!(except2))。如果是等值判断返回是true,那么except1和except2为x<=y为true,y<=x为true,整个判别式为false,假如x,y分别为hello,hello,那么对于insert来说,在插入的时候对于插入同一元素,其实是可以插入的,这样的话就破坏了关联容器的数据结构存储结构了,对于容器的破坏是极大的,会造成一些成员函数的操作是未知的。

同时要注意,本来是因为关联容器排序时是 默认是<排列的,也就是升序排列,如果要降序排列,直接重写比较子的判别式为!<,这样不会得到>的结果,而是>=,这样的话就会出现等值出现结果为true的情况,这样是不正确的。所以应该改为>,而不是直接对<取反。

总结下:

在重写关联容器的比较子时,需要万分注意等值情况下的返回值,必须是返回false。