set、map及拓展

发布时间 2023-03-22 21:13:10作者: 我的秘密小屋

1、什么时候使用哈希法?  

当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

2、常见的map、set、数组的优缺点:

map可以存放键值对,自动排序。multimap、map中find() 的时间复杂度是O(logn)   而unordered_map中find()是O(1)。他们之间区别如下表

数组  大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。

set是一个集合,里面放的元素只能是一个key,会自动排序。set不能通过迭代器来改变set中的值。set、multiset、unordered_set的区别类似map..之间的区别,如下。

3、C++中map,有三种类型:

映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map 红黑树 key有序 key不可重复 key不可修改 O(log n) O(log n)
std::multimap 红黑树 key有序 key可重复 key不可修改 O(log n) O(log n)
std::unordered_map 哈希表 key无序 key不可重复 key不可修改 O(1) O(1)

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。

同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。