【发布时间】:2016-01-04 17:42:12
【问题描述】:
我有一个使用字符串类型作为键的unordered_map:
std::unordered_map<string, value> map;
为string 提供了一个std::hash 特化,以及一个
适合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>(),并将迭代器返回到匹配值。
有什么解决办法吗?
【问题讨论】:
-
您能否更改您的程序以使用自定义的
string类来管理自己的字符串/堆分配? -
虽然我正在考虑答案,但只是一个小提示 - 您的
string_view课程通常称为string_ref -
为什么不向
string_view中引用data的std::string引用提供转换运算符?operator std::string&() { return *data; }那就没有分配了。 -
@PaulMcKenzie 大概
string_view代表字符串的一部分,而不是全部。 -
无序关联容器没有异构查找。在某些实现中,
hash<int>和hash<short>针对相同的值返回不同的结果。
标签: c++ c++11 unordered-map