ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++11中map/multimap/unordered_map以及对应set使用回顾

2021-03-14 21:58:10  阅读:214  来源: 互联网

标签:11 map multimap log key 升序 unordered


前言:今天Leetcode遇到一道题很有意思,方法还是老方法,但是得换个新数据结构才能以很简单的算法AC,这就涉及到多个基础数据结构的组合,本节主要回顾一下哈希表和哈希集合在力扣中的基础用法

文章目录

使用场景及概述

当你想通过非遍历或非穷举的方式,快速判断一个元素是否出现集合里Hash Table是非常合适的数据结构

这里先总述映射和集合的性质

映射底层实现是否有序映射关系增删改查复杂度
map红黑树按key升序一对一 O ( log ⁡ n ) O(\log n) O(logn)
multimap红黑树按key升序一对多 O ( log ⁡ n ) O(\log n) O(logn)
unordered_map哈希表乱序一对一O(1)
集合底层实现是否有序元素是否唯一增删改查复杂度
set红黑树升序唯一 O ( log ⁡ n ) O(\log n) O(logn)
multiset红黑树升序可重复 O ( log ⁡ n ) O(\log n) O(logn)
unordered_set哈希表乱序唯一O(1)

1 映射容器

其中mapmultimap的头文件都是

#include <map>

unordered_map的头文件是

#include <unordered_map>

1.1 map

map容器的底层实现是红黑树,且元素按key值升序排列。因此可保证乱序插入,按key升序输出,相当于自带sortbuff,用起来实在方便。

map<string, int> map;

map["B"] = 22;
map["A"] = 11;
map["D"] = 44;
map["C"] = 33;
cout << "map中的key值遍历(升序——底层红黑树实现):" << endl;
for (auto& m : map) 
    cout << m.first << ',' << m.second << endl;

cout << "map中的key值反向迭代器遍历(降序——底层红黑树实现):" << endl;
for (auto it = map.rbegin(); it != map.rend(); it++) 
    cout << it->first << ',' << it->second << endl;

在这里插入图片描述

1.2 multimap

multimap容器的底层实现也是红黑树,特点是可以实现一对多映射,且元素按key值升序排列。因此也可保证乱序插入,按key升序输出。不过插入用法如下

【插入用法】multimap_name.insert({key, element})

multimap<string, int> multiMap;

cout << "multimap中的key值遍历(升序红黑树实现):" << endl;
multiMap.insert({"B", 22});
multiMap.insert({"B", 11});
multiMap.insert({"A", 11});
multiMap.insert({"D", 44});
multiMap.insert({"C", 33});
for (auto& m : multiMap) 
    cout << m.first << ',' << m.second << endl;
cout << "multimap中的key值反向迭代器遍历(降序——底层红黑树实现):" << endl;
for (auto it = multiMap.rbegin(); it != multiMap.rend(); it++) 
    cout << it->first << ',' << it->second << endl;

从输出结果看出,multimap虽然按key值升序排列,但对于相同key的不同value是服从先到先得顺序
在这里插入图片描述

1.3 unordered_map

unordered_map容器的底层实现是Hash Table元素乱序存储,但增删改查效率极高,复杂度均为 O ( 1 ) O(1) O(1)

unordered_map<string, int> unMap;

cout << "unordered_map中的key值无序(底层哈希表实现):" << endl;
unMap["B"] = 22;
unMap["A"] = 11;
unMap["D"] = 44;
unMap["C"] = 33;
for (auto& m : unMap) 
    cout << m.first << ',' << m.second << endl;

在这里插入图片描述

参考文献

[1] 关于哈希表,你该了解这些

标签:11,map,multimap,log,key,升序,unordered
来源: https://blog.csdn.net/SL_World/article/details/114804352

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有