哈希表小知识点及引申

unordered_map中的小知识

unordered_map 将 key的某种类型 通过哈希函数映射成 size_t 即可 等价成数组

例如:unordered_map<string,int> map中的键(key)string 通过hash函数转化成特定的size_t(unsigned int)类型,即和vector没太大区别

对某些没有默认哈希函数的类型可以自定义哈希函数,例如下列函数:

1
2
3
4
5
6
7
8
// 通过 对int类型的默认哈希函数 自定义 对array<int, 26> 类型的哈希函数
auto arrayHash = [fn = hash<int>{}] (const array<int, 26>& arr) -> size_t {
return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) {
return (acc << 1) ^ fn(num);
});
};

unordered_map<array<int, 26>, vector<string>, decltype(arrayHash)> mp(0, arrayHash);

上述函数用到的lambda表达式

lambda:lambda本质上是一个普通的函数,只是它不像普通函数这样声明,
它是我们的代码在过程中生成的,用完即弃的函数,不算一个真正的函数,是匿名函数 。
格式:[] ({形参表}) {函数内容} / ->返回类型{函数内容}

中括号表示的是捕获,作用是如何传递变量 lambda使用外部(相对)的变量时,就要使用捕获。
如果使用捕获,则:

添加头文件: #include< functional >
捕获[]使用方式:
[=],则是将所有变量值传递到lambda中
[&],则是将所有变量引用传递到lambda中
[a]是将变量a通过值传递,如果是[&a]就是将变量a引用传递
它可以有0个或者多个捕获