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()
- 一般来说,哈希表都是用来快速判断一个元素是否存在集合里