C++ Primer 第十一章 11.4 无序容器 练习和总结

11.4无序容器

C++11新增了4中容器,他们是无序关联容器,因为他们组织元素不靠比较运算符,而是使用一个哈希函数和==运算符,这些容器组织的元素没有明显的顺序,所以他们是无序关联容器。

有序的关联容器,在某个时候维护序需要较大的代价,如果我们并不会利用元素的序,那么可以使用无序关联容器。

因为无序关联容器也有multi版本,因此大部分情况下,有序关联容器和有序关联容器都是可以互换着使用的。

无序容器在组织上为一组桶,每个桶内都有零个或者多个元素。使用哈希函数将关键字映射到桶。

关键字通过哈希函数来计算哈希值,哈希值对应着某一个桶,如果关键字得到的是相同的哈希值,那么元素将会被放到同一个桶中,所以multi类型的无序容器,同一关键字的多个元素放在同一个桶中。

如果一个桶中有多个关键字,那么在查找元素时,找到这个桶之后,对桶中的元素进行顺序搜索,得到对应的关键字的元素。

把关键字映射为哈希值找到对应的桶是很快的操作,但是如果桶中有很多个元素,那么在顺序搜索的时候会耗费一定的时间。因此无序关联容器的性能取决于哈希函数的质量和桶的数量。

因为无序关联容器靠桶来组织,所以无序关联容器提供了一组桶的管理操作。

在这里插入图片描述

无序容器对关键字类型的要求

之前的有序容器中,关键字类型重载了<符号就可以了。
如果没有重载可以通过自定义比较操作函数。

在无序关联容器中,除了关键字类型要重载了==还不行,还需要提供hash模板

扫描二维码关注公众号,回复: 9460860 查看本文章

当然这两样没有也没事,自定义函数就可以了。

需要定义两个函数,一个代替==运算符,一个代替计算hash值。

操作和之前自定义<的函数一样。
在这里插入图片描述

在这里插入图片描述

练习

11.37

无序容器无需维护元素的序,因此将对来说存储和访问效率更高。

如果我们的业务需求,涉及到存储元素的序,那么使用有序容器更好。比如查找一个人的所有图书。

11.38

把对应的map改为unordered_map就可以了。

发布了54 篇原创文章 · 获赞 6 · 访问量 3310

猜你喜欢

转载自blog.csdn.net/zengqi12138/article/details/104381422
今日推荐