前面我们已经深入学习了有序关联式容器,本节将继续学习关联式容器的另外一个分支——无序关联式容器。从名字上我们就可以看出,无序关联式容器的特点是“无序”,那怎么个“无序“法?根据前面对关联式容器的学习读者不难猜出,此处”无序“意为——元素不会自动进行排序,而且杂乱地存放在一段空间内。无序关联式容器,又被称为"哈希容器",底层通过哈希表实现。可简单理解为:通过哈希函数把key映射为一个哈希值,再通过取模运算得到桶数组的索引位置,在该位置存储相应的value,从而实现快速访问,达到O(1)的访问效率。由于元素的位置完全由哈希函数决定,而不是按键值大小顺序排列,因此元素在容器中的分布是"无序"的。需要注意的是,与普通的数组不同,哈希表底层实际上是一个桶数组配合解决哈希冲突的链式结构,而非简单的连续存储。无序关联式容器有:unordered_map容器、unordered_multimap容器、unordered_set容器、unordered_multiset容器。
无序关联式容器分别有什么特点?
unordered_map容器:无序存放且保持键值的唯一性。
unordered_multimap容器:无序存放且允许存在重复键值。
unordered_set容器:无序存放且只存键,失去排序功能,留下去重功能。
unordered_multiset:无序存放且只存键,失去排序去重功能,与普通数组“无异”(优点在于O(1)的高效访问)。
下面以unordered_map容器为例,简单演示一下无序关联式容器的增查操作:
#include <iostream> #include<unordered_map>//需要包含头文件 #include<string> using namespace std; /*unordered_map*/ void test() { unordered_map<string,string> webs; webs["C语言网"] ="dotcpp.com" ; webs.insert({"计算机二级C语言","https://www.dotcpp.com/course/erjic/"}); webs.insert({"C语言教程","https://www.dotcpp.com/BbNkeAOzdW.php/cms/archives?ref=addtabs"}); webs.insert({"数据结构教程","https://www.dotcpp.com/course/ds/"}); cout << "C语言网->"<<webs["C语言网"]<<'\n'; cout << "计算机二级C语言->"<<webs["计算机二级C语言"]<<'\n'; cout << "C语言教程->"<<webs["C语言教程"]<<'\n'; cout << "数据结构教程->"<<webs["数据结构教程"]<<'\n'; } int main() { test(); return 0; }
编译结果如下:
和map一样,我们通过'[]'访问到unordered_map内的元素。
总结:虽然只比有序关联式容器多了个“unordered",却是完全不一样的底层实现,更快的value访问,怀着无比好奇的心情,让我们开启无序关联式容器的学习!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程