我希望能够做到这一点:

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/

10-11 22:13