向 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,并消除了存储函数指针的开销。
我有以下代码:
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,并消除了存储函数指针的开销。