Effective STL :切勿直接修改关联容器之的键
1. 禁止直接修改
map<int, string> m;
......
m.begin()->first = 10;
map or multimap无法编译;原因是上述元素的类型是pair<const K, V>
键值是const的,所以不能被修改;
对于set<T> or multiset<T>类型的对象,元素类型是T,
看起来是可以进行上述操作的,其实是禁止修改的,委员会不让改的,他们啥考虑
其实set类型,全部形式set<T, TLess>,可以改变值(有些标准库也是不行的,以库为准),不要改变键。
2. 考虑用排序的vector替代关联容器
关联容器的插入,删除,搜索分为三个阶段: 设置阶段 查找阶段 重组阶段。
原因是他们是红黑树。上述三个阶段带来了时间开销,红黑树每个节点包含了父节点指针,左儿子指针,右儿子指针,及数据域。
当排序好后的vector,结合binary_search,lower_bound , equal_range等泛型算法时,效率会更好些。
不过泛型算法满足不了业务特殊需求时,那么自己实现的话,可能在性能上取决于实现者了,各有利弊。

浙公网安备 33010602011771号