C++STL中的hash数据结构
——unordered_set
参考链接
leetcode题目推荐
用于存放hash散列,其搜索插入移除通常为常数时间,其原理是声明一个有n个桶的数据结构
特点:
- unordered_set为一种容器,以不特定的顺序存储
唯一
元素,可根据值检索 - unordered_set中,元素的值同时事唯一标识它的键,键不可变,只可以增删。
- 在内部,unordered_set中的元素没有按照任何特定的顺序排序,而是根据它们的散列值组织成桶(一个线性链表代表一个桶),从而允许通过它们的值直接快速访问单个元素(平均时间复杂度为常数)[想象一下拉链法]
- unordered_set容器比set容器更快地通过它们的键访问单个元素,尽管它们在元素子集的范围迭代中通常效率较低;容器中的迭代器只能是正向迭代器
基本的函数
构造
std::unordered_set<std::string> c: //初始化容器;
//初始化容器,并将"aaa", "bbb", "ccc"加入到容器中;
std::unordered_set<std::string> c{ "aaa", "bbb", "ccc" }:
std::unordered_set<std::string> c{ 16 }: //初始化容器,并设置16个桶;
添加
c.insert("dddd"): //向容器添加元素”dddd";
a.insert({ "aaa","bbbb","cccc" }): //向容器添加元素"aaa","bbbb","cccc";
//b是一个存储着和a相同类型元素的向量,可将b中所有元素添加到a中。
a.insert(b.begin(), b.end()):
查找
a.find("eeee"):查找元素"eeee",返回结果为a.end()则表明没有找到,否则返回所对应元素;
a.count("eeee"):查找元素"eeee"在a中有几个(由于unordered_set中没有相同的元素,所以结果通常为0或1)。
查找桶接口
a.bucket_count():返回数据结构中桶的数量;
a.bucket_size(i):返回桶i中的大小;
a.bucket(“eeee"):返回元素"eeee"在哪个桶里。
观察器
a.hash_function()("aaa"):返回"aaa"所对应的hash值;
a.key_eq()("aaa","aaaa") :当元素相同时返回true,否则返回false。
清除元素
a.clear():清除a中所有元素;
a.erase("aaa"):清除元素"aaa"。
统计函数
a.size():返回a中总的元素个数;
a.max_size():返回a中最大容纳元素;
a.empty():判断a中是否为空。
C++STL中的hash容器
——unordered_map
参考链接1
参考链接2
参考链接3——B站一个简单的使用视频
leetcode题目推荐——桶排序相关练习
C++ 11中加入unordered系列容器,unorderd_map用法与上述set用法基本类似;在运用中常与map结构进行对比
- 查找插入效率:
- unordered_map > hash_map > map
- 空间复杂度:
- map > unordered_map > hash_map
- unorder_map容器中的数据是无序的,而map中的是有序的,因其采用红黑树实现,故进行中序遍历会得到有序遍历。
特性和使用
- 采用键值对(pair类型)的形式存储数据,各个键值对的键互不相同且不允许修改,容器内部不会对键值对进行排序
- 使用时应加入 #include <unordered_map>
- unordered_map的迭代器是一个指针,指向这个元素,通过迭代器取得其值,键值分别是迭代器的first和second属性,如:
unordered_map<Key, T>::interator it;
it->first;
it->second;
成员函数
迭代器
begin 返回指向容器起始位置的迭代器(iterator)
end 返回指向容器末尾位置的迭代器
cbegin 返回指向容器起始位置的常迭代器(const_iterator)
cend 返回指向容器末尾位置的常迭代器
Capacity
size 返回有效元素个数
max_size 返回 unordered_map 支持的最大元素个数
empty 判断是否为空
元素访问
operator[] 访问元素
at 访问元素
元素修改
insert 插入元素
erase 删除元素
swap 交换内容
clear 清空内容
emplace 构造及插入一个元素
emplace_hint 按提示构造及插入一个元素
操作
find 通过给定主键查找元素,没找到:返回unordered_map::end
count 返回匹配给定主键的元素的个数
equal_range 返回值匹配给定搜索值的元素组成的范围
Buckets
bucket_count 返回槽(Bucket)数
max_bucket_count 返回最大槽数
bucket_size 返回槽大小
bucket 返回元素所在槽的序号
load_factor 返回载入因子,即一个元素槽(Bucket)的最大元素数
max_load_factor 返回或设置最大载入因子
rehash 设置槽数
reserve 请求改变容器容量