知其然首先要知其所以然,我们先来看看为什么会有unordered_set函数吧
问题引出:
有一个int型数组nums,里面有很多数据,现在需要设计一个函数,来检测里面有没有相等的数据
思路:
用哈希思想,创建一个数组hash,将nums中的数据影射到hash中,若是hash至少有一个地方被映射了2次,则有相等的数据,否则没有
方法一:用vector容器当hash
则vector中的空间为从vector[0]到vector[nums.max],这其中可能浪费了很多空间,因为不保证nums中的数据都是连续的,如图
既然用vector会浪费不必要的空间,那我们就需要一种不浪费这些空间的容器,于是unordered_set容器应运而生
方法二:用unordered_set容器当hash
由于unordered_set不以键值对的形式存储数据,而是直接存储数据的值,所以不会浪费空间
接下来我们开始介绍unordered_set
头文件:
#include<unordered_set>
unordered_set为STL标准库中的一个容器,可以理解为无序容器,有以下几个特点:
- 不再以键值对的形式存储数据,而是直接存储数据的值 //键值对:比如说a[1]=5,1就是键,5就是键值,1--5就是键值对
- 容器内部存储的各个元素的值都互不相等,且不能被修改
- 不会对内部存储的数据进行排序
其在C++中的定义如下
template < class Key, // 存储的元素类型 class Hash = hash<Key>, // 使用的哈希函数 class Pred = equal_to<Key>, // 判断各个元素是否相等的元素 class Alloc = allocator<Key> // unordered_set::allocator_type > class unordered_set;
一共有4个参数,只有key没有默认值,因此我们在使用时要至少写入一个参数
注意:如果 unordered_set 容器中存储的元素为自定义的数据类型,则默认的哈希函数 hash<key> 以及比较函数 equal_to<key> 将不再适用,只能自己设计适用该类型的哈希函数和比较函数,并显式传递给 Hash 参数和 Pred 参数。
功能函数
函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的正向迭代器。 |
end(); | 返回指向容器中最后一个元素之后位置的正向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过其返回的是 const 类型的正向迭代器。 |
cend() | 和 end() 功能相同,只不过其返回的是 const 类型的正向迭代器。 |
empty() | 若容器为空,则返回 true;否则 false。 |
size() | 返回当前容器中存有元素的个数。 |
max_size() | 返回容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同。 |
find(key) | 查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(如果 end() 方法返回的迭代器)。 |
count(key) | 在容器中查找值为 key 的元素的个数。 |
equal_range(key) | 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中值为 key 的元素所在的范围。 |
emplace() | 向容器中添加新元素,效率比 insert() 方法高。 |
emplace_hint() | 向容器中添加新元素,效率比 insert() 方法高。 |
insert() | 向容器中添加新元素。 |
erase() | 删除指定元素。 |
clear() | 清空容器,即删除容器中存储的所有元素。 |
swap() | 交换 2 个 unordered_set 容器存储的元素,前提是必须保证这 2 个容器的类型完全相等。 |
bucket_count() | 返回当前容器底层存储元素时,使用桶(一个线性链表代表一个桶)的数量。 |
max_bucket_count() | 返回当前系统中,unordered_set 容器底层最多可以使用多少桶。 |
bucket_size(n) | 返回第 n 个桶中存储元素的数量。 |
bucket(key) | 返回值为 key 的元素所在桶的编号。 |
load_factor() | 返回 unordered_set 容器中当前的负载因子。负载因子,指的是的当前容器中存储元素的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() / bucket_count()。 |
max_load_factor() | 返回或者设置当前 unordered_set 容器的负载因子。 |
rehash(n) | 将当前容器底层使用桶的数量设置为 n。 |
reserve() | 将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳 count 个元(不超过最大负载因子)所需的数量,并重新整理容器。 |
hash_function() | 返回当前容器使用的哈希函数对象。 |