unordered_set容器

知其然首先要知其所以然,我们先来看看为什么会有unordered_set函数吧

问题引出:

有一个int型数组nums,里面有很多数据,现在需要设计一个函数,来检测里面有没有相等的数据

思路:

用哈希思想,创建一个数组hash,将nums中的数据影射到hash中,若是hash至少有一个地方被映射了2次,则有相等的数据,否则没有


方法一:用vector容器当hash

则vector中的空间为从vector[0]到vector[nums.max],这其中可能浪费了很多空间,因为不保证nums中的数据都是连续的,如图

1b57bf2e5961482d95a3c3b3261f05bc.png

 

既然用vector会浪费不必要的空间,那我们就需要一种不浪费这些空间的容器,于是unordered_set容器应运而生

 

方法二:用unordered_set容器当hash

由于unordered_set不以键值对的形式存储数据,而是直接存储数据的值,所以不会浪费空间

c2cd6ebace724f90915a41de13cd49fe.png


 

接下来我们开始介绍unordered_set

头文件:

#include<unordered_set>

unordered_set为STL标准库中的一个容器,可以理解为无序容器,有以下几个特点:

  1. 不再以键值对的形式存储数据,而是直接存储数据的值    //键值对:比如说a[1]=5,1就是键,5就是键值,1--5就是键值对
  2. 容器内部存储的各个元素的值都互不相等,且不能被修改        
  3. 不会对内部存储的数据进行排序

其在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()返回当前容器使用的哈希函数对象。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值