C++ 11 将自定义的哈希函数传递到unordered_map中。

问题描述 投票:0回答:1

我不确定我是否理解为什么这个编译。

#include <iostream>
#include <iterator>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <queue>
using namespace std;



void thing() {
    auto hash = [](const std::pair<int, int> &pair) {
        return std::hash<string>()(to_string(pair.first));
    };
    auto map = std::unordered_map<std::pair<int, int>, int, decltype(hash)>();
}


int main() {

}

我没有将哈希函数传递到构造函数中--它是如何知道如何实现哈希对的?

c++ dictionary hash
1个回答
3
投票

它可能会被编译,因为lambda表达式的类型是一个匿名类--它可以被实例化(但请看下面的注释)。该代码块是该类的 operator()() 方法。这个类被构造函数实例化为默认参数值。std::unordered_map - 使用lambda表达式的类型,也就是一个模板参数。

unordered_map( InputIt first, InputIt last,
               size_type bucket_count = /*implementation-defined*/,
               const Hash& hash = Hash(), /* <<<< INSTANTIATION HAPPENS HERE */
               const key_equal& equal = key_equal(),
               const Allocator& alloc = Allocator() );

关于lambda表达式的性质,请看这个SO问题。

什么是C++11中的lambda表达式?


注意:正如评论者所指出的,你的代码 实际上并没有用C++11编译因为在C++11中,由lambda表达式定义的匿名类的隐式默认构造函数被删除了。 这一点在C++20中被改变了:非捕获的lambdas得到了一个默认构造函数,所以现在代码确实可以编译。

© www.soinside.com 2019 - 2024. All rights reserved.