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等泛型算法时,效率会更好些。

         不过泛型算法满足不了业务特殊需求时,那么自己实现的话,可能在性能上取决于实现者了,各有利弊。

 

posted @ 2021-11-18 21:00  Kiris  阅读(72)  评论(0)    收藏  举报