条款19:了解相等和等价的区别
操作上来说,相等的概念是基于operator==的。如果表达式“x == y”返回true,x和y有相等的值,否则它们没有。等价是基于在一个有序区间中对象值的相对位置。两个对象x和y如果在关联容器c的排序顺序中没有哪个排在另一个之前,那么它们关于c使用的排序顺序有等价的值。!(w1 < w2) && !(w2<w1) 要完全领会相等和等价的含义,考虑一个忽略大小写的set<string>,也就是set的比较函数忽略字符串中字符大小写的set<string>。这样的比较函数会认为“STL”和“stL”是等价的。
条款20:为指针的关联容器指定比较类型
struct DereferenceLess {
template <typename PtrType>
bool operator()(PtrType pT1, PtrType pT2) const {return *pT1 < *pT2; }
};
typedef set<string*, DereferenceLess > StringPtrSet;
StringPtrSet ssp;
set不要一个函数,它要的是能在内部用实例化建立函数的一种类型(仿函数模板)。
条款21: 永远让比较函数对相等的值返回false
除非你的比较函数总是为相等的值返回false,你将会打破所有的标准关联型容器,不管它们是否允许存储复本。从技术上说,用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。任何一个定义了严格的弱序化的函数都必须在传入相同的值的两个拷贝时返回false。
条款22:避免原地修改set和multiset的键
对于set和multiset,如果你进行任何容器元素的原地修改,你有责任确保容器保持有序。
条款23:考虑用有序vector代替关联容器
在有序vector中存储数据很有可能比在标准关联容器中保存相同的数据消耗更少的内存;当页面错误值得重视的时候,在有序vector中通过二分法查找可能比在一个标准关联容器中查找更快。当然,有序vector的大缺点是它必须保持有序!当一个新元素插入时,大于这个新元素的所有东西都必须向上移一位。
条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择
m[k] = v; 检查键k是否已经在map里。如果不,就添加上,以v作为它的对应值。如果k已经在map里,它的关联值被更新成v。通过使用map-insert代替map::operator[]就能节省一些。
条款25:熟悉非标准散列容器
hash_set、hash_multiset、hash_map和hash_multimap