向 unordered_map 提供自定义 hashing/equal 函数

supply custom hashing/equal func to unordered_map

我有以下代码:

typedef std::size_t (*hash_func)(const sp_movie& movie);
typedef bool (*equal_func)(const sp_movie& m1,const sp_movie& m2);

typedef std::unordered_map<sp_movie, double, hash_func, equal_func> rank_map;

这些是我想在 unordered_map 中使用的实际功能:

std::size_t sp_movie_hash(const sp_movie& movie);
bool sp_movie_equal(const sp_movie& m1,const sp_movie& m2);

但是,我无法使用我的自定义哈希函数和我创建的相等函数创建 rank_map。 我不想使用 类 作为哈希值和相等值,我只想将我创建的函数传递给 unordered_map。

我试过这段代码:

rank_map check (sp_movie, double, sp_movie_hash, sp_movie_equal);
rank_map check (sp_movie_hash, sp_movie_equal);

两个都不行

唯一合适的构造函数是也接受 bucket_count 的构造函数。传递 0 似乎有效:

rank_map check(0, sp_movie_hash, sp_movie_equal);

但是,如果您不想在运行时 select hash/equality 函数,您应该将它们变成函子 (default-constructible 类)。如果您不想自己编写 类,您可以将函数(令人惊讶地)包装在 std::integral_constant:

using rank_map = std::unordered_map<sp_movie, double,
    std::integral_constant<decltype(&sp_movie_hash), sp_movie_hash>,
    std::integral_constant<decltype(&sp_movie_equal), sp_movie_equal>
>;

这使您的哈希映射 default-constructible,并消除了存储函数指针的开销。