C++中常用的哈希结构
- 数组
- set(集合)
- map(映射)
以下主要谈谈set和map
set
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否改变数值 | 查询效率 | 增删效率 |
set | 红黑树 | 有序 | 否 | 否 | O(logn) | O(logn) |
multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
C++中提供了三种set数据结构,其底层实现以及优劣如上表所示,红黑树是一棵平衡二叉搜索树,所以key值是有序的,但key不可更改,改动key值会导致整棵树的错乱,所以只能删除和增加。
当需要使用到集合来解决哈希问题的时候,首先考虑使用unordered_set,如果需要数据有序,则使用set,如果需要数据不可重复。则需要使用multiset。
map
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否改变数值 | 查询效率 | 增删效率 |
map | 红黑树 | key有序 | key不可重复 | key不可更改 | O(logn) | O(logn) |
multimap | 红黑树 | key有序 | key可重复 | key不可更改 | O(logn) | O(logn) |
unordered_map | 哈希表 | key无序 | key不可重复 | key不可更改 | O(1) | O(1) |
map是一个<key,value>结构,map中对key有限制,而对value没有限制,因为key的存储方式是红黑树来实现的。
总结
- 调用find()方法来检验查询是否成功,若成功,则返回该key值对应的迭代器,若不成功,则返回该哈希结构的end()
- 一般来说,哈希表都是用来快速判断一个元素是否存在集合里