11.4无序容器
C++11新增了4中容器,他们是无序关联容器,因为他们组织元素不靠比较运算符,而是使用一个哈希函数和==运算符,这些容器组织的元素没有明显的顺序,所以他们是无序关联容器。
有序的关联容器,在某个时候维护序需要较大的代价,如果我们并不会利用元素的序,那么可以使用无序关联容器。
因为无序关联容器也有multi版本,因此大部分情况下,有序关联容器和有序关联容器都是可以互换着使用的。
无序容器在组织上为一组桶,每个桶内都有零个或者多个元素。使用哈希函数将关键字映射到桶。
关键字通过哈希函数来计算哈希值,哈希值对应着某一个桶,如果关键字得到的是相同的哈希值,那么元素将会被放到同一个桶中,所以multi类型的无序容器,同一关键字的多个元素放在同一个桶中。
如果一个桶中有多个关键字,那么在查找元素时,找到这个桶之后,对桶中的元素进行顺序搜索,得到对应的关键字的元素。
把关键字映射为哈希值找到对应的桶是很快的操作,但是如果桶中有很多个元素,那么在顺序搜索的时候会耗费一定的时间。因此无序关联容器的性能取决于哈希函数的质量和桶的数量。
因为无序关联容器靠桶来组织,所以无序关联容器提供了一组桶的管理操作。
无序容器对关键字类型的要求
之前的有序容器中,关键字类型重载了<符号就可以了。
如果没有重载可以通过自定义比较操作函数。
在无序关联容器中,除了关键字类型要重载了==还不行,还需要提供hash模板。
当然这两样没有也没事,自定义函数就可以了。
需要定义两个函数,一个代替==运算符,一个代替计算hash值。
操作和之前自定义<的函数一样。
练习
11.37
无序容器无需维护元素的序,因此将对来说存储和访问效率更高。
如果我们的业务需求,涉及到存储元素的序,那么使用有序容器更好。比如查找一个人的所有图书。
11.38
把对应的map改为unordered_map就可以了。