Boot unordered_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 的查找函数,但也有一个采用 K 的模板化查找函数,通常这些东西应该可以工作容器:
- 知道如何对异构类型进行哈希处理,并且
- 知道将异构类型作为右侧的相等运算符。
即使我这样做:
auto equal_to = [](auto& lhs, auto& rhs) { return lhs == rhs; };
并将这个相等类传递给容器我仍然收到错误:
boost::unordered::unordered_flat_map<std::string, int, decltype(equal_to)> my_map;
我该如何让它发挥作用?
还有一个解决方案,但我需要更多空间 =]
您可以将查找包装在函数中(例如):
int lookup(std::string_view k) {
static std::string backing;
backing = k;
return my_map.find(backing);
}
由于
std::string
是静态的,因此它不会不断地分配和取消分配每个函数调用。