1.unordered系列关联式容器
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,这里只对unordered_map和unordered_set进行介绍,unordered_multimap和unordered_multiset学生可查看文档介绍。
1.1.unordered_set
1.1.1.unordered_set的介绍
unordered_set类的文档介绍:unordered_set - C++ Reference (cplusplus.com)
注:
1. unordered_set是存储key值的关联式容器。2. 在unordered_set中,key值用于惟一地标识元素。3. 在内部,unordered_set没有对key按照任何特定的顺序排序, 为了能在常数范围内找到key,unordered_set将相同哈希值的key放在相同的桶中。4. unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。5. 它的迭代器是前向迭代器。
1.1.2.unordered_set的使用
此处只简单演示unordered_set与set的不同,其他接口与set相同,可参考set。
(1)set中的迭代器是双向迭代器,因此set中有begin、end、rbegin、rend函数。unordered_set中的迭代器是单向迭代器,因此unordered_set中有begin、end函数而没有rbegin、rend函数。
(2)set遍历访问的数据是有序的,unordered_set遍历访问的数据是无序的
(3)set底层是红黑树,其搜索效率为,unordered_set底层是哈希,其搜索效率为O(1),如下面代码所示
注:rand函数产生的随机数其实是有限制的,c语言rand函数有一个RAND_MAX,其最大只能产生三万多个随机数,因此如果上面的n值很大时,重复的数据是很多的,打印出来的size值(不重复的值)远小于n值。如果想让随机数变得更多可以如下图所示,给rand函数+循环变量i。
1.2.unordered_map
1.2.1.unordered_map的介绍
unordered_map类的文档介绍: unordered_map - C++ Reference (cplusplus.com)注:1. unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。5. unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。6. 它的迭代器是前向迭代器。
1.2.2.unordered_map的使用
此处只简单演示unordered_map与map的不同,其他接口与map相同,可参考map。
(1)map中的迭代器是双向迭代器,因此map中有begin、end、rbegin、rend函数。unordered_map中的迭代器是单向迭代器,因此unordered_map中有begin、end函数而没有rbegin、rend函数。
(2)map遍历访问的数据是有序的,unordered_map遍历访问的数据是无序的
(3)map底层是红黑树,其搜索效率为,unordered_map底层是哈希,其搜索效率为O(1)
1.3.unordered_multiset和unordered_multimap
unordered_multiset和multiset用法及功能基本相同,unordered_multimap和multimap用法及功能基本相同,下面讲解unordered_multiset、unordered_multimap和multiset、multimap的不同:
(1)multiset、multimap中的迭代器是双向迭代器,因此multiset、multimap中有begin、end、rbegin、rend函数。unordered_multiset、unordered_multimap中的迭代器是单向迭代器,因此unordered_multiset、unordered_multimap中有begin、end函数而没有rbegin、rend函数。
(2)multiset、multimap遍历访问的数据是有序的,unordered_multiset、unordered_multimap遍历访问的数据是无序的
(3)multiset、multimap底层是红黑树,其搜索效率为,unordered_multiset、unordered_multimap底层是哈希,其搜索效率为O(1)