一文学会c++哈希
文章目录
- unordered系列关联性容器
- unordered_map
- ❤底层结构
- 哈希概念
unordered系列关联性容器
❤必看红黑树篇
STL提供了底层为红黑树的一系列容器,查询的效率为log2n,即最差情况下需查询红黑树高度次,如果数据太多,查询效率还是不理想,所以c++11又提供了unordered系列容器查询效率可达O(1),使用方法与红黑树系列容器基本一致,只是底层不一样,也有4个
unordered_map, unordered_set, unordered_multimap, unordered_multiset
unordered_map
unordered_map文档
特性:
1,unordered_map存储<key,value>键值对,通过key值直接找到value
2,unordered_map存储key值唯一,value是映射值,两者类型可以不同。
3,unordered_map没有对<key,value>进行任何排序
4,unordered_map将相同哈希值存到同一个哈希桶中
5,unordered_map查询比map快,但遍历元素比map慢,(因为要遍历许多空的哈希桶)
6,unordered_map实现了[],可以直接通过key访问value
接口:
1 构造:
unordered_map | 构造各种类型的unordered_map对象 |
2 容量:
bool empty() const | 检查unordered_map是否为空 |
size_t size() const | 检查unordered_map有效元素个数 |
3 迭代器:
begin() | 返回第一个元素的迭代器 |
end() | 返回最后一个元素下一个元素迭代器 |
cbegin() | 返回第一个元素const迭代器 |
cend() | 返回最后一个元素下一个元素const迭代器 |
4 💪元素访问[]
operator[] | 通过key访问value |
❤注意,该函数实际调用插入操作,
⭐如果哈希表中无key,直接插入并返回 V(),
⭐如果哈希表有key插入失败,说明存在,返回value值,
5 查询
iterator find(const K& key) | 返回key值在哈希桶中位置 |
size_t count(const K& key) | 返回哈希桶中关键码为key的个数 |
注意:unordered_map中count最多为1
6 修改
insert(make_pair()) | 插入键值对 |
erase(const K& key) | 删除key值 |
void clear() | 清空容器 |
void swap(const unordered_map& ) | 交换两个容器元素 |
7 unordered_map桶操作
size_t bucket_count() const | 返回哈希桶中桶的个数 |
size_t bucket(const K&key) | 返回key值在哈希桶号 |
size_t bucket_size(size_t n) | 返回n号哈希桶有效元素个数 |
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{int a[] = { 5,8,7,6,89,5,3,5,5,4,11};unordered_map<int, int> mp;for (auto& e : a){mp.insert(make_pair(e, e));}cout << mp.bucket_count()<<endl;for (auto& e:a){cout<<mp.bucket(e)<<" ";}return 0;
}
unordered_set没什么好说的,与set区别就是无顺序,
unordered_set文档
❤底层结构
哈希系列容器之所以效率高,因为使用了哈希结构
哈希概念
顺序结构和平衡树中关键码和对应位置无关系,因此查询一个元素时,必须经过关键码的多次比较,顺序结构O(N),树形结构O(logN),效率取决于比较次数
理想搜索方法,=不经过任何比较一次性直接找到值,将关键码和存储位置建立一一映射关系,搜索时直接找到。
向该结构中
- ⭐插入元素:将关键值交给哈希函数 ,计算出存储位置的值并在该位置存储
- ⭐搜索元素:将关键值交给哈希函数,将计算出的值当作存储位置,若此位置关键码相等,则搜索成功,
例如集合{1,7,6,4,5,9}
将哈希函数设置为 hash(key)= key%capacity,capacity为底层存储空间总大小