Boostunordered_flat_map
非常好,比 快得多std::unordered_map
。我尝试将它与异构键类型一起使用:
boost::unordered::unordered_flat_map<std::string, int> my_map;
my_map.emplace(std::string("Hello"), 1);
my_map.find(std::string_view("Hello"));
// no instance of overloaded function matches the argument list
argument types are: (std::string_view)
现在,因为我创建了一个具有键类型 std::string 的映射,所以有一个接受 std::string 的 find 函数,但也有一个接受 K 的模板化 find 函数,并且通常这些东西应该在容器下工作:
- 知道如何对异构类型进行哈希处理,并且
- 知道一个将异构类型作为右侧的相等运算符。
即使我这样做:
auto equal_to = [](auto& lhs, auto& rhs) { return lhs == rhs; };
并将这个相等类传递给容器我仍然收到错误:
boost::unordered::unordered_flat_map<std::string, int, decltype(equal_to)> my_map;
我该如何让它工作呢?
从 cppreference 中我们了解到透明哈希/相等性可以实现异构键查找:
因此,你可以这样做:
现在,
equal_to
我们可以偷懒并使用std::equal_to</*void*/>
已经透明的:在 Coliru 上直播
通过所有断言。在我的代码中,我可能不会依赖它
equal_to<void>
来防止意外。您可以替换 Boost 的“Rosetta Stone”core::string_view
¹。您还可以使哈希更具容忍度(例如,用 Boost ContainerHash 来表达它)。¹ 可与许多语言互操作,例如 boost::beast::string_view 和 std::string_view 等。但是,它不支持可配置的字符特征。
又一个解决方法,但我需要更多空间=]
您可以将查找包装在一个函数中(例如):
由于
std::string
是静态的,因此它不会在每个函数调用时不断地分配和取消分配。