c++ 常用STL 之set_kangshuangzhu的博客-CSDN博客 中总结了关联式容器和set。这一篇介绍一下unordered_map的用法。

之所以介绍unordered_map而不是map,是因为unordered_map在效率上有明显的优势

                  | map             | unordered_map
---------------------------------------------------------
Ordering        | increasing  order   | no ordering| (by default)        |Implementation  | Self balancing BST  | Hash Table| like Red-Black Tree |  search time     | log(n)              | O(1) -> Average |                     | O(n) -> Worst CaseInsertion time  | log(n) + Rebalance  | Same as searchDeletion time   | log(n) + Rebalance  | Same as search

unordered_map还是从初始化,增,删,改, 查入手

初始化

    std::unordered_map<std::string, std::string> m1;// list constructorstd::unordered_map<int, std::string> m2 ={{1, "foo"},{3, "bar"},{2, "baz"},};// copy constructorstd::unordered_map<int, std::string> m3 = m2;// move constructorstd::unordered_map<int, std::string> m4 = std::move(m2);// range constructorstd::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1} };std::unordered_map<std::string, double> m5(v.begin(), v.end());

这里需要注意的问题是unordered_map的key一定得是可hash的,即自己带有hash函数,否则就不能当做unordered_map的key。 不过可以当做map的key,因为map以红黑树形式存储。

遍历

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());for(auto i: m5){std::cout << i.first << " " << i.second << std::endl;}for(auto i = m5.begin(); i != m5.end(); i++){std::cout << i -> first << " " << i -> second << std::endl;}

在第二种方法中,因为i是迭代器(benzhi jius

查找某个元素

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());auto i = m5.find("0x12");std::cout << i -> first << " " << i -> second << std::endl;

如果find没有找到某键值对,则返回迭代其end()

这里可以看到查找和遍历的时候,对map的一个键值对的处理特别像pair,事实上c++确实是把map的一个键值对当成了pair来处理的。下面的代码可以很清晰的看到这个特点

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());auto i = m5.find("0x12");std::cout << typeid(*i).name()  << std::endl;输出
NSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEdEE

unordered_map还有一个类似java的写法 map[key]  但是应该特别注意,用这种写法查询一个key的值的时候,如果key不存在,会给把key加入到map中,value添加一个默认值。而且这种写法可以直接修改map中一个key的值

    std::unordered_map<std::string,std::string> mp;std::cout << "kkk " << (mp.find("kkk") == mp.end()) << std::endl;std::cout << "kkk " << mp["kkk"] << std::endl;std::cout << "kkk " << (mp.find("kkk") == mp.end()) << std::endl;mp["kkk"] += "nonono"; std::cout << "kkk " << mp["kkk"] << std::endl;
输出kkk 1
kkk
kkk 0
kkk nonono

value的默认值对数值类型是0 ,string类型是空字符串,其他类型没有尝试过,但为了不增加debug难度,最好不要用于其他的复杂结构。

有的版本c++中unordered_map有at这个函数,有的版本没有,为了保险起见,最好不要用这个函数。

判断unordered_map 是否包含某个元素:

umap.find(x) != map.end()//查
//或者
umap.count(x) != 0

empty()  返回map是否为空

size()  返回map大小

unordered_map也是一个无序容器,所以新增元素的时候位置并不重要。

emplace

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());for(auto i: m5){std::cout << i.first << " " << i.second << std::endl;}m5.emplace("kkk",20);for(auto i = m5.begin(); i != m5.end(); i++){std::cout << i -> first << " " << i -> second << std::endl;}

emplace一次向map中添加一个键值对。

insert 可以一次性插入多个键值对

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());// auto i = m5.find("0x12");// std::cout << typeid(*i).name()  << std::endl;// std::cout << i -> first << " " << i -> second << std::endl;for(auto i: m5){std::cout << i.first << " " << i.second << std::endl;}m5.insert({{"kkk",20},{"sss",3}});for(auto i = m5.begin(); i != m5.end(); i++){std::cout << i -> first << " " << i -> second << std::endl;}

当然,insert也可以用来合并两个map

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());for(auto i: m5){std::cout << i.first << " " << i.second << std::endl;}std::unordered_map<std::string, double> m6 = { {"yyy", 23}, {"uuu", 34}};m5.insert(m6.begin(), m6.end());for(auto i = m5.begin(); i != m5.end(); i++){std::cout << i -> first << " " << i -> second << std::endl;}

clear 删除所有元素

erase 删除某个键值对

    std::vector<std::pair<std::string, int>> v = { {"0x12", 1}, {"0x01",-1},  {"0x00",-1} ,{"0x03",-2}};std::unordered_map<std::string, double> m5(v.begin(), v.end());for(auto i: m5){std::cout << i.first << " " << i.second << std::endl;}std::unordered_map<std::string, double> m6 = { {"yyy", 23}, {"uuu", 34}};m5.erase("0x03");for(auto i = m5.begin(); i != m5.end(); i++){std::cout << i -> first << " " << i -> second << std::endl;}

修改一个key的值是用的最多的场景

 auto it = umap.find(key) //改if(it != umap.end()) {it->second = new_value; }

c++ 常用STL 之unordered_map相关推荐

  1. C++常用STL容器

    C++常用STL容器 vector 向量容器 二维数组指针.二维向量 pair 对 list 双向列表 map 表 unordered_map 哈希表 set 集合 unordered_set 哈希集 ...

  2. stl中unordered_map 和 map的区别 ?

    stl中unordered_map 和 map的区别 目录 一.hash_map与unordered_map 二.unordered_map与map 三.unordered_map与unordered ...

  3. 三、C++的常用STL

    关于STL:全称Standard Template Library,STL是一个软件库,里面包含算法(algorithms).容器(containers).函数(functions).迭代器(iter ...

  4. C++常用STL讲解

    关于STL(标准模板库) Standard Template Library,缩写:STL STL是一个C++软件库,里面包含算法(algorithms).容器(containers).函数(func ...

  5. 最全ACM常用STL

    STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include <algorithm> using namespace std; 调用: next_permut ...

  6. Python常用STL

    4月9日就要参加蓝桥杯了,我现在才下载软件.来捡一捡知识点.重在这个学习过程.不管结果了. 下面来看一看Python常用的STL,如果我没记错的话就是蓝桥杯爱考的. 字符串 主要包括对字符串的大小变换 ...

  7. 【C++】-- STL之unordered_map/unordered_set详解

    目录 一.map/set和unordered_map/unordered_set的区别 二.unordered_set 1.特点 2.构造 (1)构造一个空的 unordered_set对象 (2) ...

  8. ACM竞赛常用STL(二)之STL--algorithm

    <algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的. 下面列举出<algorithm>中的模板函数: adjacent_find / binar ...

  9. 算法竞赛常用STL库

    栈(Stack) 概念:就像一个盒子一样,进去想出来就得等上面的先出去,也就是"先进后出". 往往栈的功能有上面四种,下面我们手写一个栈来实现这四种功能来更好的理解一下. 模拟栈的 ...

最新文章

  1. TC264信标组 双车组 资源规划 库函数示例
  2. DataTable分页控件设计(适用于Gridview和Repeater)
  3. 探讨PHP获取checkbox值
  4. 什么从什么写短句_结婚纪念日发朋友圈说说 致自己结婚纪念日短句 一句话经典...
  5. Hadoop(六)搭建分布式HBase集群
  6. java一到6章上机代码_JAVA练习题(第6章).ppt
  7. go json tag 字符串 整数_json:你或许还不知道的序列化操作(一)
  8. oracle安装后再建库,oracle-数据库的安装与建库
  9. SVN 安装与使用教程总结
  10. openstack使用openvswitch实现vxlan组网
  11. android系统功耗问题:systrace
  12. python序列操作_操作序列(python)
  13. @OneToOne or @ManyToOne on references an unknown entity:
  14. 简单常用的互联网赚钱工具分享
  15. matplotlib中堆积图、分块图、气泡图的绘制
  16. 计算机房管理制度通知,计算机房管理制度.doc
  17. js实现——鼠标单击事件-onclick和双击事件-ondblclick
  18. SwiftUI 绘制刻度时钟表盘(自定义组件教程含源码)
  19. 青柠开车Spring Cloud(七) —— 断路器 Hystrix
  20. IE,谷歌访问跨域问题

热门文章

  1. 4-20mA转RS-485,Modbus数据采集模块 WJ121
  2. HTTP服务器的实现--CGI中POST表单。
  3. 软件生命周期之软件计划阶段
  4. 设计模式 | 备忘录模式及典型应用
  5. 计算机视觉:图像特征与描述大全 ,有代码(一篇博文带你简单了解完图像特征提取技术)
  6. 卡拉兹(Callatz)猜想,PAT(Basic Level) Practise NO.1001
  7. R 语言:简短的示例
  8. matlab绿色 不伤眼,蓝光和超清哪个伤眼睛 伤害都很低不用过多担心
  9. mysql router是什么_数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作...
  10. C/C++使用Windows的API实现共享内存以及同步