我希望能够做到这一点:
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...
}