在使用unordered_map踩的坑


之前在做一個東西,使用了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'); //有邊界檢查


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM