std::unordered_map配合自定义类型的使用

1.unordered_map内部元素无序,而map是有序的。

2.unordered_map,元素为自定义类型时需要提供自定义的hash函数。为什么?
c++11中,unordered_map定义如下:
这里写图片描述
参数1为传入的key。
参数2为传入的value。
参数3为hash函数,这个函数默认是std::hash,它对内置的类型以及std::string都具有很好的支持,但是不支持自定义类型,故我们需要自定义hash函数为我们自定义的类型。
参数4为比较函数,这个函数默认是std::equal_to,它对内置的类型以及std::string都具有很好的支持,但是不支持自定义类型,需要自定义类型提供对==的重载。
除了从函数定义式来回答为什么需要比较函数外,我们可以从以下进行解释。
即两个相等的value总是导致相同的bucket索引,而不同的value理应导致不同的bucket索引。如果没有比较函数,将导致一个bucket中有多个相同的元素,这样做很浪费,完全没必要。

3.解释了2中的疑问,现在说说怎样自定义hash函数?

从语法的角度,hash函数有以下两种方式,
方式1,(全局函数)
std::size_t customer_hash_func(const T& c)
{
return …
}

方式2,(函数对象)
struct hashFunc
{
std::size_t operator()(const T& c)
{

}
}
4.也可以自定义比较函数(非必须)

比较函数也有以下两种方式,
方式1,(全局函数)
bool eq(const T& c1, const T& c2)
{

}

方式2,(函数对象)
struct equalFunc
{
bool operator()(const T& c1,const T& c2)
{

}
}
以上两种方式均需要T对==的重载,即
class T
{
bool operator==(const T& t1)
{

}
}

4.调用方式。
全局函数方式:
std::unordered_map#T,int,decltype(&customer_hash_func),decltype(&eq)> umap;
函数对象方式:
std::unordered_map#T,int,hashFunc,equalFunc> umap;
或者
std::unordered_map#T,int,hashFunc> umap;
注:为了能正常显示,用#代替<

可参考:
1.https://blog.csdn.net/yo_bc/article/details/61195377
2.https://blog.csdn.net/happykocola/article/details/74188452
3.https://blog.csdn.net/zhangpiu/article/details/49837387
4.https://blog.csdn.net/whizchen/article/details/9286557

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值