1 简介

  • unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。
  • key值应该是唯一的,key和value的数据类型可以不相同。
  • unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。
  • unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。
  • 可以使用[]操作符来访问key值对应的value值。

2 简单使用

std::unordered_map<std::string, std::int> umap; //定义umap.insert(Map::value_type("test", 1));//增加//根据key删除,如果没找到n=0
auto n = umap.erase("test")   //删除auto it = umap.find(key) //改
if(it != umap.end()) it->second = new_value; //map中查找x是否存在
umap.find(x) != map.end()//查
//或者
umap.count(x) != 0

注意:使用auto循环时候,修改的值作用域仅仅循环之内,出去循环还会变成未修改的数值。

erase()也不能直接删除,参考这个文章

for(auto x:unomap)//遍历整个map,输出key及其对应的value值
{x.second = 0; cout<<x.second<<endl;//全是  000;;
}
cout<<x.second<<endl;//回复原来的数值的。
彻底改变:使用find彻底找到这个数值,然后在进行改,可以保证作用域是整个程序。
for(auto x:unomap)//遍历整个map,输出key及其对应的value值
{auto it = umap.find(key) //改if(it != umap.end()) it->second = new_value;
}
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{string key="123";int value=4;unordered_map<string, int> unomap;//创建一个key为string类型,value为int类型的unordered_mapunomap.emplace(key, value);//使用变量方式,插入一个元素unomap.emplace("456", 7);//也可以直接写上key和value的值cout<<unomap["123"];//通过key值来访问valuecout<<endl;for(auto x:unomap)//遍历整个map,输出key及其对应的value值cout<<x.first<<"  "<<x.second<<endl;for(auto x:unomap)//遍历整个map,并根据其key值,查看对应的value值cout<<unomap[x.first]<<endl;
}

[遍历map]

unordered_map<key,T>::iterator it;(*it).first;   //the key value(*it).second   //the mapped valuefor(unordered_map<key,T>::iterator iter=mp.begin();iter!=mp.end();iter++)cout<<"key value is"<<iter->first<<" the mapped value is "<< iter->second;//也可以这样for(auto& v : mp)print v.first and v.second

3 c++中map与unordered_map的区别

  • 运行效率方面:unordered_map最高,而map效率较低但 提供了稳定效率和有序的序列。
  • 占用内存方面:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。

3.1 头文件

  • map: #include < map >
  • unordered_map: #include < unordered_map >

3.2 内部实现机理

  • map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
  • unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的

3.3 优点、缺点、使用场景

map

优点有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作。红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高。
缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质,使得每一个节点都占用大量的空间
适用处:对于那些有顺序要求的问题,用map会更高效一些。

unordered_map

优点:内部实现了哈希表,因此其查找速度是常量级别的。
缺点:哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

note

  • 对于unordered_map或者unordered_set容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的

c++】STL 容器 unordered_map用法详解
c++中map与unordered_map的区别
简述C++中map和unordered_map的用法

附录:

#include<iostream> //map的基本操作如下
#include<map>
#include<string>using namespace std;int main()
{// 构造函数map<string, int> dict;// 插入数据的三种方式dict.insert(pair<string,int>("apple",2));dict.insert(map<string, int>::value_type("orange",3));dict["banana"] = 6;// 判断是否有元素if(dict.empty())cout<<"该字典无元素"<<endl;elsecout<<"该字典共有"<<dict.size()<<"个元素"<<endl;// 遍历map<string, int>::iterator iter;for(iter=dict.begin();iter!=dict.end();iter++)cout<<iter->first<<ends<<iter->second<<endl;// 查找if((iter=dict.find("banana"))!=dict.end()) //  返回一个迭代器指向键值为key的元素,如果没找到就返回end()cout<<"已找到banana,其value为"<<iter->second<<"."<<endl;elsecout<<"未找到banana."<<endl;if(dict.count("watermelon")==0) // 返回键值等于key的元素的个数cout<<"watermelon不存在"<<endl;elsecout<<"watermelon存在"<<endl;pair<map<string, int>::iterator, map<string, int>::iterator> ret;ret = dict.equal_range("banana"); // 查找键值等于 key 的元素区间为[start,end),指示范围的两个迭代器以 pair 返回cout<<ret.first->first<<ends<<ret.first->second<<endl;cout<<ret.second->first<<ends<<ret.second->second<<endl;iter = dict.lower_bound("boluo"); // 返回一个迭代器,指向键值>=key的第一个元素。cout<<iter->first<<endl;iter = dict.upper_bound("boluo"); // 返回一个迭代器,指向值键值>key的第一个元素。cout<<iter->first<<endl;return 0;
}
#include<string>
#include<iostream>
#include<unordered_map>
using namespace std;  int main()
{unordered_map<string, int>  dict; // 声明unordered_map对象// 插入数据的三种方式dict.insert(pair<string,int>("apple",2));dict.insert(unordered_map<string, int>::value_type("orange",3));dict["banana"] = 6;// 判断是否有元素if(dict.empty())cout<<"该字典无元素"<<endl;elsecout<<"该字典共有"<<dict.size()<<"个元素"<<endl;// 遍历unordered_map<string, int>::iterator iter;for(iter=dict.begin();iter!=dict.end();iter++)cout<<iter->first<<ends<<iter->second<<endl;// 查找if(dict.count("boluo")==0)cout<<"can't find boluo!"<<endl;elsecout<<"find boluo!"<<endl;if((iter=dict.find("banana"))!=dict.end())cout<<"banana="<<iter->second<<endl;elsecout<<"can't find boluo!"<<endl;return 0;
}

C++中的unordered_map用法详解相关推荐

  1. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  2. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  3. C#中NameValueCollection类用法详解

    C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...

  4. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  5. python中的super用法详解_【Python】【类】super用法详解

    一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(sel ...

  6. JSP 中EL表达式用法详解

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  7. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  8. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  9. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

最新文章

  1. Python培训分享:python爬虫可以用来做什么?
  2. Firefox浏览器常见问题开讲
  3. jquery中如何表达本页网址_如何用js得到当前页面的url信息方法(JS获取当前网址信息)...
  4. 老子《道德经》第六章
  5. UI布局引擎Layout 之 QGraphicsLinearLayout
  6. python内置模块(三)
  7. perl引用中的闭包closure
  8. XLSTransformer 导出Excel数据
  9. Windows10最常用的软件推荐V1.7
  10. 简单Web服务器程序设计与实现
  11. Webbygram:网页版Instagram再生
  12. python安装及使用技巧
  13. Kafka 官方文档1(中文)
  14. java中短信验证登录_java实现短信验证码功能
  15. 【P-00】anaconda 安装总结
  16. 牛客网最全在线笔试、编程攻略(建议收藏)
  17. 你真的了解验证码吗?
  18. hadoop1.1.2分布式安装---集群动态增减节点
  19. 程序员应该了解的 “基金” 小常识
  20. python创建一个列表、包括学生姓名年龄祖籍_Python列表(list)练习题

热门文章

  1. 如何恢复vscode的默认配置_VS恢复默认设置的2种方法
  2. 360手机n4s骁龙版 html,高通骁龙机型 360N4S骁龙版_360 手机N4S_手机市场-中关村在线...
  3. 扩频码OVSF是干什么的
  4. DSCTF2022 fuzzerinstrospector-Wp
  5. HTB_Weak RSA
  6. 简单实用的Python图像处理库Pillow
  7. RT-Thread 流水笔记一 startup ,schedule,thread
  8. 猫和老鼠汤姆看java_猫和老鼠:盘点汤姆5种超越认知的形态,最后一种“痛不欲生”!...
  9. 卡拉兹(Callatz)猜想(c/c++)
  10. pdf怎么合并?合并有技巧