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

前言:今天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;

在这里插入图片描述

2 集合

multiset

multiset<int> s; 

s.insert(12); 
s.insert(10); 
s.insert(2); 
s.insert(10); // 重复元素
s.insert(90); 
s.insert(85); 
s.insert(45); 

multiset<int>::iterator it, it1, it2; 
cout << "Multiset elements after sort" << endl; 
for (it = s.begin(); it != s.end(); it++) 
	cout << *it << ' ';	 
cout << endl; 
it1 = s.find(10); 
it2 = s.find(90); 

s.erase(it1, it2); 

cout << "Multiset Elements after erase" << endl; 
for (it = s.begin(); it != s.end(); it++) 
	cout << *it << ' ';	 
return 0; 

输出结果

Multiset elements after sort
2 10 10 12 45 85 90
Multiset Elements after erase:
2 90

参考文献

[1] Difference between set, multiset, unordered_set, unordered_multiset
[2] 关于哈希表,你该了解这些

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值