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