在使用unordered_map踩的坑

本文深入探讨了C++ STL中unordered_map的使用方法,包括常见bug的避免,如不能通过insert方法更新已存在的键值对。文章还介绍了unordered_map的内部实现,基于hash表的高效查找和插入特性,并提供了遍历和修改元素的正确示范。
摘要由CSDN通过智能技术生成

之前在做一个东西,使用了unordered_map,其中出现了一个bug。后面发现原来是使用unordered_map 时,不能通过重新插入key&value更新之前的东西。
其中multi_set unordered_set multi_map 都不能这样改变
比如

unordered_map<char,string> mymap;
mymap.insert(pair<char,string>('a',"aaaaa"));
// mymap.insert(make_pair('a',"aaaaa"));
mymap.insert(pair<char,string>('a',"bbbbb"));//修改失败

mymap['a'] = "bbbbb"; //可以成功修改

这里我们可以判断一下

auto result_it = mymap.insert(pair<char,string>('a',"bbbbb"));//修改失败
std::cout << "result_it.second : " << result_it.second << std::endl;

若如过更改成功,result_it.second = 1,如果失败,result_it.second = 0。
如果之前某个键key已经存在了,那么是不能通过insert进行更改的。

关于unordered_map 是基于hash实现的,查找和O(1),最差O(n)
map 在查找是O(lg(n))
插入unordered_map 插入O(1)

hash表每个格子就是一个bucket,
可以通过mymap.bucket(x) 查看x所属于的bucket
可以通过mymap.bucket_count(),查看有多少个bucket
可以通过mymap.load_factor()查看一些其他信息

unordered_map存在[] 操作符,但是用于遍历的,一般是用于改变值

mymap['a'] = "bbbbb"; //可以成功修改
cout<<mymap['a']<<endl;//错误

在遍历值时最好使用迭代器

unordered_map<char,string> iter = mymap.find('a');
if(iter!= mymap.end()){
    cout<<*iter<<endl;
}

multimap以及unordered_multimap 没有[]操作符

//unordered_map<char,string> iter;
pair<unordered_map<char,string>,bool> ret;
ret = mymap.insert(make_pair('b',"bbbbb"));
if(ret->second){
    cout<<*ret->first<<endl;
}

至于hash冲突解决方式类似于

mymap['a']; //这种没有边界检查
mymap.at('a'); //有边界检查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值