赞
踩
目录
1、声明 unordered_map hash;,value>
3、增加(插入)元素 hash.insert(pair(key,value));,vtype>
4、删除元素 hash.erase(it pos);hash.erase(key);
前言:unordered_map使用了哈希表的原理实现,其增删查改的时间复杂度都是O(1),空间复杂度是O(n),适用于快速查找。
unordered_map:
- #include<unordered_map>
- unordered_map<int,int> hash;
- //<int,int>里第一个是用来查找的键的数据类型,第二个是值的数据类型,如:
-
- unordered_map<int,int> hash;
- hash[1]=10;
unordered_set:
- #include<unordered_set>
- unordered_set<string> set;
使用下标访问:
hash[key];
unordered_map插入元素
(因为unordered_map无序,所以无所谓从头尾中间插入 )
- unordered_map<char,int> hash;
-
- hash["a"]=1; //方法1:直接用[] hash[key]=value;
-
- hash.insert(make_pair("a",1)); //方法2:make_pair hash.insert(make_pair(key,value));
-
- hash.insert(pair<char,int>("a",1)); //方法3:pair hash.insert(pair<char,int>(key,value));
unordered_set插入元素
set.insert("a");
删除方式 | 函数声明 | 说明 |
---|---|---|
删除一个元素! 根据元素位置 | iterator erase (const_iterator position); | 返回一个迭代器,指向被删除元素的后一个元素 |
删除一个元素! 根据元素的键 | size_type erase (const key_type& k); | 返回被删除元素的数目 |
删除某一范围的元素! 由一对范围迭代器指定删除的范围 | iterator erase (const_iterator first, const_iterator last); | 返回一个迭代器,指向最后一个被删除元素的后一个元素 |
删除所有元素! | void clear() noexcept; |
-
- hash.erase(hash.begin()); // erasing by iterator
-
- mymap.erase("a"); // erasing by key
-
- mymap.erase(mymap.find("a"), mymap.end()); // erasing by range
- hash["a"]=1;
- hash["a"]=10;// map修改value
1 查找某个元素的下标
hash.find("a");
如果key在map中,find方法会返回key对应的迭代器。如果key不存在,find会返回end。
2 查找某个元素是否存在
- hash.find("a")!=hash.end(); //方法一 hash.find(),存在返回迭代器,不存在返回end()
-
- bool a_in_map=hash.count("a")>0?true:false; //方法二 hash.count() 存在返回1,不存在返回0
如果a在哈希表中,find()返回下标,该表达式为true;如果a不在哈希表中,find返回迭代器end(),该表达式为false
3 查找哈希表内元素总数
int count=hash.size();
- unordered_map<int,int> map={
- pair<int,int>(1,2),
- pair<int,int>(3,4)
- };
-
- //方式一:值传递遍历
- for(pair<int,int> kv:map){
- cout<<kv.first<<kv.second<<endl;
- }
-
- for(auto kv:map){
- cout<<kv.first<<kv.second<<endl;
- }
-
- //遍历set
- for (auto tmp : set)
- {
- cout << tmp;
- }
-
-
- //方式二:引用传递遍历
- (注意:要加const)
- for(const pair<int,int>& kv:map){
- cout<<kv.first<<kv.second<<endl;
- }
-
- for(auto& kv:map){
- cout<<kv.first<<kv.second<<endl;
- }
-
- //方式三:使用迭代器遍历
- for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++){
- cout<<it->first<<it->second<<endl;
- }
-
- for(auto it=map.begin();it!=map.end();it++){
- cout<<it->first<<it->second<<endl;
- }
-
- //方式四:结构化绑定(c++17特性)
- //值传递
- for(auto [k,v]:map){
- cout<<k<<v<<endl;
- }
- //引用传递
- for(auto& [k,v]:map){
- cout<<k<<v<<endl;
- }
- //其中,如果只想使用键,值可以用_代替
- for(auto& [k,_]:map){
- cout<<k<<endl;
- }
- //同理,如果指向只用值,键可以用_代替
- for(auto& [_,v]:map){
- cout<<v<<endl;
- }

定义一个unordered_map的迭代器:
unordered_map<int,int>::iterator it;
迭代器可以用来:(1)访问元素(包括遍历,遍历就是逐个访问)(2)某些函数会返回迭代器,我们要用迭代器来接收。
- hash.begin();
- hash.end();
hash.begin()是迭代器,指向第一个元素。
hash.end()是迭代器,指向的是最后一个元素下一个位置,指向不存在的空间,不可以访问!!
(1)访问元素
- auto it=hash.begin();
- char b=it->first;
- int c=it->second;
(2)遍历
- unordered_map<int,int>::iterator it;
- for(it=hash.begin();it!=hash.end();it++){
- cout<<it->first<<it->second<<endl;
- }
(3)接收函数的返回值
- auto it=hash.erase(hash.begin());
-
- auto it=hash.find("a");
哈希思想 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
哈希表和链表:
1429
哈希表和队列:
346
哈希表和平衡树:
1146
918
哈希表和随即队列:
380
381
哈希表和前缀和:
325
1248
哈希表和双指针:
395
76
992
参考博客:
(39条消息) C++/C--unordered_map常见用法详解_XDWX的博客-CSDN博客_c unordered_map
(39条消息) c++ map unordered_map使用大全_bitcarmanlee的博客-CSDN博客_unordered_map使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。