我希望能够做到这一点:
std::unordered_map<icu::UnicodeString, icu::UnicodeString> mymap;
但是,当我这样做(并且我开始使用它)时,我收到了“无法将 size_t 转换为 UnicodeString”的错误。所以我环顾四周和 read up on unordered containers 。这篇博文指出我需要提供
std::hash<icu::UnicodeString>
的特化,所以我正是这样做的:namespace std
{
template<>
class hash<icu::UnicodeString> {
public:
size_t operator()(const icu::UnicodeString &s) const
{
return (size_t) s.hashCode();
}
};
};
虽不完美,但满足要求。但是,现在我收到的错误源于:
error C2039: 'difference_type' : is not a member of 'icu_48::UnicodeString'
博文本身暗示我需要做更多;然而,它并没有告诉我我应该做什么,以这些评论结束:
所以,现在我有点困惑,因为
operator==
is defined for UnicodeString 。因此,使用 C++11、MSVC 和 GCC。还使用 Qt 依赖项进行编译。然后,我的问题是,为了将
icu::UnicodeString
类型添加到无序映射,我还需要做什么?根据要求,我稍后尝试遍历 map 。 map 本身是一个名为
this->mymap
的类的一部分:std::unordered_map<icu::UnicodeString, icu::UnicodeString>::const_iterator it;
for ( it = this->mymap.begin(); it != this->mymap.end(); ++it )
{
// access it->first, it->second etc...
}
最佳答案
正如 OP 发现的那样,
由于无序映射具有 2 参数插入方法,
template <class P>
iterator insert(const_iterator hint, P&& obj);
编译器将尝试将
key
匹配为 const_iterator
,这可能是请求 difference_type
类型成员(它是迭代器的成员)的原因。插入条目的正确方法是插入一对,
mymap.insert(std::make_pair(key, value));
或者只是使用“emplace”方法,
mymap.emplace(key, value);
关于c++ - 如何从ICU创建具有非STL类型(例如UnicodeString)的unordered_map?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10125211/