1.理解相等(equality)和等价(equivalence)的区别
相等的概念是基于operator==的。等价关系是以“在已排序的区间中对象值得相对顺序”为基础的。如果从每个标准关联容器的排列顺序来考虑等价关系,那么着将是有意义的。标准关联容器室基于等价而不是相等的。标准关联容器总是保持排列顺序的,所以每个容器必须有一个比较函数(默认less)来决定保持怎样的顺序。等价是按照比较函数子。因此,标准关联容器的使用者要为所使用的每个容器指定一个比较函数(用来决定如何排序)。如果该关联容器使用相等来决定两个对象是否有相同的值,那么每个关联容器除了用于排序的比较函数外,还需要另一个比较函数来决定两个值是否相等(默认情况下,该比较函数应该是equal_to,但有趣的是equal_to从来没有被用做STL的默认比较函数。当STL中需要相等判断时,一般的惯例是直接调用operator==。比如,非成员函数find算法就是这么做的)
2.为包含指针的关联容器指定比较类型
why?第一条已经说明关联容器是要排序。每当你要创建包含指针的关联容器时,一定要记住,容器将会按照指针的值进行排序。一般是不是你希望的,所以你几乎要创建自己的函数子类作为该容器的比较类型。
3.总是让比较函数在等值情况下返回false
比较函数的返回值表明的是按照该函数定义的排列顺序,一个值是否在另一个之前。相等的值从来不会有前后顺序关系,所以,对于相等的值,比较函数应该始终返回false。
4.切勿直接修改set或multiset中的键。
5。考虑用排序的vector替代关联容器
在排序的vector中存储数据可能比在标准关联容器中存储同样的数据要耗费更少的内存,而考虑到页面错误的因素,通过二分搜索法来查找一个排序的vector可能比查找一个标准关联容器要更快一些。
6.当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择
map::operator[]的设计目的是为了提供“添加和更新”的功能。添加一个新元素最好选后者insert。
7.熟悉非标准的散列容器。