Effective STL:3、关联容器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_30534935/article/details/102761892

就像电影《绿野寻踪》中的多色马一样,关联容器是一些不同颜色的动物。不错,它们和序列容器有很多相同的特性,但是在很多方面也有本质的不同。比如,它们会自动排序;它们按照等价而不是相等的标准来对待自己的内容;set 和 map 不允许有重复的项目;map 和 multimap 通常忽略它们所含的每个对象中的一半。不错,关联容器是容器,但如果你能允许我把 vector 比作堪萨斯州的话,那么我们肯定不会还在堪萨斯州了。


在本章的条款中,我将介绍 “等价” 这个重要的概念;讲述对比较函数的重要限制;说明对于包含指针的关联容器,自定义比较函数的意义;讨论键的常量性的官方含义和实际含义;并对如何提高关联容器的效率给出一些建议。


在本章最后,我将指出 STL 中没有基于散列表的容器,并举出两个常见的(非标准)实现。尽管 STL 本身并没有提供散列表,你却不必自己写一个,或者干脆不用它。已经有高质量的实现在等着你了。



第19条:理解相等和等价的区别


在实际操作中,相等的概念是基于 operator== 的。

等价关系是以 “在已排序的区间中对象之的相对顺序” 为基础的。



第20条:为包含指针的关联容器指定比较类型


如果你有一个包含智能指针或迭代器的容器,那么也要考虑为它指定一个比较类型。



第21条:总是让比较函数在等值情况下返回 false


从技术上来说,用于对关联容器排序的比较函数必须为它们所比较的对象定义一个 “严格的弱序化”。



第22条:切勿直接修改 set 或 multiset 中的键


直接修改键的值对 map 或 multimap 是行不通的,但对于 set 和 multiset 是可能的。



第23条:考虑用排序的 vector 替代关联容器


如果我们把 Widget 存储在 vector 中,则不会有额外开销;我们只是简单地存储一个 Widget。

假设我们的数据结构足够大,它们被分割后将跨越多个内存页面,vector 占用页面更少。



第24条:当效率至关重要时,请在 map::operator[] 与 map::insert 之间谨慎做出选择


如果要更新一个已有的映射表元素,则应该优先选择 operator[];但如果要添加一个新的元素,那么最好还是选择 insert。



第25条:熟悉非标准的散列容器


已经有决定要在标准的下一个版本中包含散列容器,但到现在为止,STL 中没有散列容器。



猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/102761892