如何在boost::unordered_flat_map中使用异构键类型?
解决Boost unordered_flat_map异构键查找问题
要让boost::unordered::unordered_flat_map支持用std::string_view查找键类型为std::string的元素,你需要同时满足两个核心条件:哈希函数能处理异构类型,以及比较器能支持键类型与异构类型的相等判断。你之前只传入了比较器,却忽略了哈希函数的适配,这是报错的主要原因。
具体实现步骤
1. 定义支持异构类型的哈希函数
需要写一个哈希结构体,同时支持std::string和std::string_view的哈希计算:
struct HeterogeneousHash { size_t operator()(const std::string& s) const { return std::hash<std::string>{}(s); } size_t operator()(std::string_view sv) const { return std::hash<std::string_view>{}(sv); } };
2. 定义支持异构比较的相等判断器
这个结构体需要覆盖所有可能的类型组合(同类型、跨类型),避免容器内部操作出错:
struct HeterogeneousEqual { bool operator()(const std::string& lhs, std::string_view rhs) const { return lhs == rhs; } bool operator()(std::string_view lhs, const std::string& rhs) const { return lhs == rhs; } bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs == rhs; } bool operator()(std::string_view lhs, std::string_view rhs) const { return lhs == rhs; } };
3. 实例化容器并使用异构查找
将自定义的哈希和比较器传入容器模板参数,之后就能正常用std::string_view调用find:
#include <boost/unordered/unordered_flat_map.hpp> #include <string> #include <string_view> // 上面的HeterogeneousHash和HeterogeneousEqual定义放在这里 int main() { boost::unordered::unordered_flat_map<std::string, int, HeterogeneousHash, HeterogeneousEqual> my_map; my_map.emplace("Hello", 1); // 用string_view查找 auto it = my_map.find(std::string_view("Hello")); if (it != my_map.end()) { // 处理找到的元素,比如输出it->second } return 0; }
为什么之前的Lambda比较器不行?
你只传入了泛型Lambda作为比较器,但默认的哈希函数boost::hash<std::string>只能处理std::string类型,无法计算std::string_view的哈希值。此外,Lambda作为模板参数时,虽然是泛型的,但Boost容器对比较器的类型要求更严格,使用结构体形式的比较器能避免潜在的类型推导问题。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

