C++ STL Unordered Container无序容器

本文介绍了C++ STL中的无序容器,基于哈希表实现,详细讨论了再散列的两种策略、创建与控制容器的方法、自定义哈希和等价准则,以及查找、赋值、插入、移除等操作。同时,阐述了无序容器在实际应用中的优势和使用技巧,包括bucket接口和unordered_map在关联数组中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件:<unordered_set><unordered_map>

在这里插入图片描述

Unordered容器的能力

在这里插入图片描述

所有标准化无序容器类都以哈希表为基础.

关于再散列,有两种实现策略:

1.传统做法:在单一insert或erase动作出现时,有时候会发生一次内部数据重新组织
2.递进式做法是:渐进改变bucket或slot数量

对于每个将被存放的元素,哈希函数会把key映射至哈希表内的某个bucket中.每个bucket管理一个单向linked list.

创建和控制Unordered容器

构造函数和析构函数

在这里插入图片描述
在这里插入图片描述

布局操作

在这里插入图片描述
re

提供你自己的Hash函数
template <typename T>
class Hash
{
   
};
template <>
class Hash<std::string>//string的显式具体化
{
   
public:
	size_t operator()(const std::string & key)
	{
   
		size_t hashval = 0;
		for (char ch : key)
			hashval = 37 * hashval + ch;
		return hashval;
	}
};
template<>
class Hash<int>//int的显式具体化
{
   
public:
	size_t operator()(int item)//除留余数法
	{
   
		size_t i = item;
		return i;
	}

};
unordered_set<int,Hash<int>>custset;

如果不愿意传递一个function obejct成为容器类型的一部分,也可以传递一个hash函数作为构造函数实参:

size_t customer_hash_func(const Customer& c)
{
   
	return...
}
unordered_set<Customer, size_t(*)(const Customer&)>custset(20,customer_hash_func);

如果没有给予特殊的哈希函数,默认的哈希函数是hash<>,可以应付整数类型、浮点数类型、指针、string、若干特殊类型,这些之外的其他类型,你就必须提供你自己的哈希函数

比较好的做法是,使用由boost提供的hash函数和一个便利接口

提供你自己的等价准则

作为无序容器类型的第三或第四模板参数,你可以传递等价准则,默认使用的是equal_to<>,以operator ==进行比较,你可以为你自己的类型提供operator== 比如:

在这里插入图片描述

在这里插入图片描述

Unordered容器的其他操作

非更易型操作

在这里插入图片描述

查找操作

在这里插入图片描述

Unordered容器对快速查找元素有着优化,在一个拥有1000个元素的集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值