【C/C++】map、unordered_map、set、unordered_set的区别和使用

区别

map

特点:内部实现一个红黑树(一种平衡二叉检索树),自动排序,map中所有元素都是有序的

优点:运行效率高,红黑树的检索效率要高于vector、队列、列表等;中序遍历可以得到有序序列,从外部操作来看只需要遍历map即可得到有序序列

缺点:树中每一个结点都需要保存:父结点、孩子结点、红/黑性质,这些信息会占用很大空间

适用于:对顺序有要求的问题

unoredered_map

特点:内部实现一个哈希表,排列无序

优点:由于是基于哈希表,所以查找速度非常快,可达到O(1)

缺点:哈希表建立耗时,遍历unoredered_map时,遍历顺序与插入顺序可能不同

适用于:查找问题

set

与map一样,内部同样实现红黑树,且中序遍历可以实现有序遍历

unordered_set

与unordered_map一样,内部同样实现哈希表,排列无序

使用

下面以unordered_map为例展示具体的操作

unordered_map(哈希表)的创建、插入、读取、判断、遍历等操作:

#include <unordered_map>

1.创建
unordered_map<type1, type2> map;
unordered_map<string, int> map = {{"A",1},{"B",2}}; //可以创建时初始化

//以<string, int>为例
string key = "A";
int value = 1;

2.大小
map.size();

3.插入
map.emplace(key, value);  //key存在则不变
map[key] = value; 		//key存在则覆盖,只有这个会覆盖
map.insert(pair<string,int>(key,value)); //key存在则不变,使用pair插入
//拓展(pair):pair<string, int>(str,i) 声明一个pair对象

4.获取
int v = map["A"]; //注意:只要进行map[X]操作,如果map中有X,则返回其value,如果没有X,则会插入X,并赋值为0

5.遍历输出
for(auto x : map){
	cout<<x.first<<" "<<x.second<<endl;
}
for(auto x: map){
    cout<<map[x.first]<<endl;
}
for(unordered_map<string,int>::iterator it=map.begin();it!=map.end();it++)
    cout<<"key: "<<it->first<<"value: "<< it->second<<endl;


6.判断key是否在map中
//count返回key出现的次数:如果没有,count返回0,有则返回1(因为unordered_map中不允许出现重复的元素)
map.count("B")!= 0 
//find返回iterator:如果key存在,返回key对应的it,如果不存在,返回end。
map.find("B")!= map.end()

//切记,不要用map["B"]来判断:如果没有B,会返回0,但也会插入一个"B",值为0;

这一系列中(map、unordered_map、set、unordered_set)的操作都大同小异,差不太多。

map和unordered_map用法一样,提供insert、size、count等操作,元素也是按照pair来存储,两者区别在于底层实现原理不同,从外部使用来看,两者几乎一致(除了有序和无序、或效率等问题,只从外部操作上看两者一样)。

set和unordered_set的操作也与map和unordered_map类似,区别在于set中保存的不是键值对,而是单独的变量,除此之外,在创建和遍历时采取的操作会有细微的不同。

操作对比

1.创建
//set 和 unordered_set
set<int> set;
unordered_set<int> un_set;

//map 和 unordered_map
map<string, int> map;
unordered_map<string, int> un_map;

2.操作
//set、unordered_set、map、unordered_map的操作都几乎相同
// 提供size()/count()/find()/insert()等函数,且功能基本都一样
// 都有begin()/end()等迭代器操作
    
3.遍历

//set 和 unordered_set
for(set<int>::iterator iter=test_set.begin();iter!=test_set.end();iter++){
	cout<<"value: "<<*iter<<endl;
}

//map 和 unordered_map
for(map<int,int>::iterator iter=test_map.begin();iter!=test_map.end();iter++){
    cout<<"key is "<<iter->first<<"value is "<< iter->second<<endl;	
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KyrieLiu52

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值