std::unordered_map::find 使用不同于 Key 类型的类型?

新手上路,请多包涵

我有一个 unordered_map 使用字符串类型作为键:

 std::unordered_map<string, value> map;

为 --- 提供了一个 std::hash string ,以及一个合适的 operator==

现在我还有一个“字符串视图”类,它是一个指向现有字符串的弱指针,避免了堆分配:

 class string_view {
    string *data;
    size_t begin, len;
    // ...
};

现在我希望能够使用 string_view 对象检查地图中是否存在键。不幸的是, std::unordered_map::find 采用 Key 参数,而不是通用的 T 参数。

(当然,我可以将一个“提升”为 string ,但这会导致我想避免分配。)

相反,我会喜欢的是

template<class Key, class Value>
class unordered_map
{
    template<class T> iterator find(const T &t);
};

这将需要 operator==(T, Key)std::hash<T>() 进行适当定义,并将迭代器返回到匹配值。

有什么解决方法吗?

原文由 peppe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 704
1 个回答

P0919R2 无序容器的异构查找 已合并到 C++2a 的工作草案中!

摘要似乎与我最初的问题完美匹配:-)

抽象的

该提议为 C++ 标准库中的无序关联容器添加了异构查找支持。因此,当提供不同(但兼容)类型作为成员函数的键时,不需要创建临时键对象。这也使得无序和规则的关联容器接口和功能彼此更加兼容。

通过本文提出的更改,以下代码将在没有任何额外性能影响的情况下运行:

 template<typename Key, typename Value>
using h_str_umap = std::unordered_map<Key, Value, string_hash>;
h_str_umap<std::string, int> map = /* ... */;
map.find("This does not create a temporary std::string object :-)"sv);

原文由 peppe 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题