大家好,我是灿视。 端午节最后一天,明天开始又是新一周忙碌的工作了。对于即将开启秋招战场的老铁们,需要调整心态,静下心来,开始查漏补缺啦!
今天这就是一题
的常规面试题。对于
中,我们会经常使用
字典数据类型,那么对于
主要就是
与
。
今天跟着小亦小姐姐,来梳理下这方面的考点。
看文章前,可以先关注下我们。
专注于分享最优质的计算机视觉面经,持续关注AI在互联网与银行等单位中的工作机会。
C++的STL库实现有两种字典结构,即map和unordered_map(也就是通俗意义上的hash map)。这两者虽然都称为Map,但其实它们的底层实现原理具有很大差距,因此它们的使用场景也不尽相同。
今天我们就来深入了解一下map和unordered_map区别,及其优缺点。
字典类型又被称为关联数组(associative array),关联数组和正常数组的使用方法是相似的,但其不同之处在于字典结构的下标不必是整数,而可以是任意类型。
map和unordered_map这两种字典结构,都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。但是字典中的key只能存在一个,即必须唯一(如果不唯一,则被称为multimap)。上述这点保证了值(value)可以直接通过键(key)来访问,这便是字典结构最为便捷之处。
①map的常见用法
#include <iostream>
#include <unordered_map>
#include <map>
#include <string>
using namespace std;
int main()
{
//注意:C++11才开始支持括号初始化
unordered_map<int, string> myMap={{ 5, "TOM" },{ 6, "JESON" }};//使用{}赋值
// map<int, string> myMap={{ 5, "张大" },{ 6, "李五" }};//使用{}赋值
myMap[2] = "Ming"; //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。
myMap.insert(pair<int, string>(3, "Lily"));//使用insert和pair插入
//遍历输出+迭代器的使用
auto iter = myMap.begin();//auto自动识别为迭代器类型unordered_map<int,string>::iterator
while (iter!= myMap.end())
{
cout << iter->first << "," << iter->second << endl;
++iter;
}
//查找元素并输出+迭代器的使用
auto iterator = myMap.find(2);//find()返回一个指向2的迭代器
if (iterator != myMap.end())
cout << endl<< iterator->first << "," << iterator->second << endl;
system("pause");
return 0;
}
使用unordered_map输出情况为:
3,Lily
2,Ming
5,TOM
6,JESON
2,Ming
若将unordered_map换成map输出情况为:
2,Ming
3,Lily
5,TOM
6,JESON
2,Ming
使用方法是最直观的区别,这两种结构虽然都在STL库中,但是所使用的头文件不同。
数据结构其实是两种类型最为根本的区别,其他的不同都是这种区别产生的结果。
在2中已经解释过了,现在单独列出该点不同之处。
这点也已经在2中已经解释过了,现在单独列出该点不同。
这点实际上也是由底层的数据结构决定的。
优点:
缺点:
优点:
缺点:
适用场景:
最后一句话,总结一下它们的适用场景:在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。因此,可理解为在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map
而不是map
。
map和unordered_map并无好坏之分,它们各自擅长的应用场景不通。它们之间的区别归根结底来源于使用的数据结构不同。
参考博文:
https://blog.csdn.net/bjzhaoxiao/article/details/80238596
https://www.cnblogs.com/yimeixiaobai1314/p/14375195.html