4

我希望能够做到这一点:

std::unordered_map<icu::UnicodeString, icu::UnicodeString> mymap;

但是,当我这样做(并且开始使用它)时,我遇到了“无法将 size_t 转换为 UnicodeString”错误。所以我环顾四周并阅读了 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==() 版本。这通常是您在创建新类时习惯于构建的一个函数,但如果您忽略它,您将遇到本文前面看到的同样大量难以理解的编译器错误。

我不必在本文中处理它,因为标准库已经为 std::pair 定义了这个运算符。当然,在使用 std::pair 时,您还必须确保您有 T1 和 T2 的相等运算符。

所以,现在我有点困惑,因为operator==是为 UnicodeString 定义的

因此,使用 C++11、MSVC 和 GCC。还使用 Qt 依赖项进行编译。然后,我的问题是,我还需要做什么才能将icu::UnicodeString类型添加到无序映射?

根据要求,我稍后会尝试迭代地图。地图本身是一个类的一部分,称为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...
}
4

1 回答 1

3

正如 OP 发现的那样,

有人留下了一个不错mymap->insert(key, value)的错错错错

由于无序映射具有 2 参数插入方法,

template <class P>
iterator insert(const_iterator hint, P&& obj);

编译器将尝试匹配keyas a const_iterator,这可能difference_type是请求类型成员的原因(它是迭代器的成员)。

插入条目的正确方法是插入一对,

mymap.insert(std::make_pair(key, value));

或者只是使用“emplace”方法,

mymap.emplace(key, value);
于 2012-04-12T15:56:19.687 回答