前面我们已经深入学习了有序关联式容器,本节将继续学习关联式容器的另外一个分支——无序关联式容器。从名字上我们就可以看出,无序关联式容器的特点是“无序”,那怎么个“无序“法?根据前面对关联式容器的学习读者不难猜出,此处”无序“意为——元素不会自动进行排序,而且杂乱地存放在一段空间内。无序关联式容器,又被称为"哈希容器",底层通过哈希表实现。可简单理解为:通过哈希函数把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;
}

编译结果如下:

unordered_map

和map一样,我们通过'[]'访问到unordered_map内的元素。

总结:虽然只比有序关联式容器多了个“unordered",却是完全不一样的底层实现,更快的value访问,怀着无比好奇的心情,让我们开启无序关联式容器的学习!

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)