一、map
包含头文件#include<map>
map是C++标准模板库的一个关联容器,提供一对一的映射关系。
“第一个”称为关键字(key),别名是first,每个关键字只能在map中出现一次。
“第二个”称为该关键字的值“value”,别名是second。
它的底层就是pair容器。
在map内部所有的数据都是有序的,因为map是由一颗红黑树实现的,这棵树具有对数据自动排序的功能。(可以对比unordered_map容器)
map<string,int>friends; //定义
friends.insert({"Alice","1382321"}); //加入map容器中 1
friends.insert(pair<string,int>("Bob",12334)); //加入map容器中 2
friends["jake"]=73423; //可以直接这样加入 3
friends.erase("Alice"); //删除关键字为"Alice"的元素
friends.count("Alice"); //返回关键字为"Alice"的数量,由于关键字唯一,所以只返回0和1
friends.size(); //返回所有键对值的数量
friends.clear(); //清除所有的键对值
常用的相关操作:
1、
if(friends.count("Alice")) //查找关键字为"Alice"的键值
cout<<friends["Alice"];
else cout<<"not found";
2、
for(auto it=friends.begin();it!=friends.end();++it) //遍历
{
cout<<it->first<<" "<<it->second<<endl;
}
map操作的相关例子:
map<int,int>friends; //如果没有关键字,那么它的值为0
friends[10]=3; //定义
friends[10]++; //此时friends[10]的值变为4
friends[20]++; //这里没有关键字为20的元素,所以这里相当于创建一个关键字为20,且值从0变为1的元素
二、unordered_map
包含头文件#include<unordered_map>
unordered_map是用哈希表来实现的,不会像 map 容器那样对存储的数据进行排序。有些情况是不需要顺序的,所以我们使用unorder_map会更优,时间复杂度会低一点。
unordered_map在平均情况下具有常数时间的查找复杂度,而map则具有对数时间的查找复杂度。由于unordered_map是基于哈希表实现的,它的插入和查找时间都可以近似看作O(1),相对于map更快。而map基于红黑树实现,插入和删除时间均为O(log(n))。
它的操作和map是一模一样的。
unordered_map操作的相关例子:
#include<unordered_map>
unordered_map<char,int>m;
m['a']=9;
m['?']=5;
m['z']=99;
m['A']=50;
m['Z']=-2;
m[' ']=0;
cout <<m.size() <<endl;
if (m.count('?')== 1)
cout <m['?']<<endL;
for (auto it =m.begin();it!=m.end();++it)
{
cout <<it->first <" "<<it->second<<endl;
}
总结:
如果需要对键值对进行排序并遍历,选择map是更合适的;而对于大量数据的查找和插入操作,选择unordered_map 可以更快地完成相应的操作。