如何将普通C函数作为unordered_map的哈希仿函数传入
如何将C风格哈希函数用作unordered_map的哈希参数?
你不需要必须编写自定义仿函数包装器,有几种更便捷的方式可以直接把这个C风格函数作为unordered_map的哈希参数:
方式一:直接使用函数指针
unordered_map的第三个模板参数可以指定为函数指针类型,然后在构造容器时传入你的哈希函数指针:
static size_t Wang_Jenkins_hash(size_t h) { h += (h << 15) ^ 0xffffcd7d; h ^= (h >> 10); h += (h << 3); h ^= (h >> 6); h += (h << 2) + (h << 14); return h ^ (h >> 16); } // 定义哈希类型为函数指针 using MyHashMap = std::unordered_map<int, std::string, size_t(*)(size_t)>; // 构造时传入哈希函数指针 MyHashMap my_map(10, Wang_Jenkins_hash);
这种方式的缺点是每次构造容器都需要显式传递函数指针。
方式二:用std::integral_constant包装函数指针
通过std::integral_constant把函数指针包装成一个可调用的类型,这样可以直接作为模板参数使用,无需构造时传参:
#include <type_traits> static size_t Wang_Jenkins_hash(size_t h) { h += (h << 15) ^ 0xffffcd7d; h ^= (h >> 10); h += (h << 3); h ^= (h >> 6); h += (h << 2) + (h << 14); return h ^ (h >> 16); } // 用integral_constant包装函数指针 using WangJenkinsHash = std::integral_constant<size_t(*)(size_t), Wang_Jenkins_hash>; // 直接使用包装后的类型作为哈希参数 std::unordered_map<int, std::string, WangJenkinsHash> my_map;
std::integral_constant的operator()会自动调用你传入的哈希函数,使用起来和自定义仿函数一样方便。
方式三:C++17及以上使用无状态lambda
C++17允许将无状态lambda作为模板参数,你可以直接把哈希逻辑写在lambda里,或者用lambda包装你的函数:
// 直接在lambda中实现哈希逻辑 auto wang_jenkins_hash = [](size_t h) { h += (h << 15) ^ 0xffffcd7d; h ^= (h >> 10); h += (h << 3); h ^= (h >> 6); h += (h << 2) + (h << 14); return h ^ (h >> 16); }; // 用lambda的类型作为哈希参数 using MyHashMap = std::unordered_map<int, std::string, decltype(wang_jenkins_hash)>; MyHashMap my_map;
这种方式最简洁,不需要额外的类型定义,适合C++17及更高版本的环境。
内容的提问来源于stack exchange,提问作者Troskyvs
相关产品推荐
相关产品推荐

