Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用非stl类型(例如从ICU销毁)创建无序的_图?_C++_Stl_C++11_Icu_Unordered Map - Fatal编程技术网

C++ 如何使用非stl类型(例如从ICU销毁)创建无序的_图?

C++ 如何使用非stl类型(例如从ICU销毁)创建无序的_图?,c++,stl,c++11,icu,unordered-map,C++,Stl,C++11,Icu,Unordered Map,我希望能够做到这一点: std::unordered_map<icu::UnicodeString, icu::UnicodeString> mymap; 博客帖子本身暗示我需要做更多;然而,它并没有告诉我该怎么做,最后我说: 除了需要散列函数外,无序容器还需要能够测试两个键是否相等。他们实现这一点的规范方法是在全局名称空间中定义一个operator==()版本。这通常是您在创建新类时必须构造的一个函数,但是如果您忽略了它,您将遇到与本文前面看到的相同的大量不可理解的编译器错误 我

我希望能够做到这一点:

std::unordered_map<icu::UnicodeString, icu::UnicodeString> mymap;
博客帖子本身暗示我需要做更多;然而,它并没有告诉我该怎么做,最后我说:

除了需要散列函数外,无序容器还需要能够测试两个键是否相等。他们实现这一点的规范方法是在全局名称空间中定义一个operator==()版本。这通常是您在创建新类时必须构造的一个函数,但是如果您忽略了它,您将遇到与本文前面看到的相同的大量不可理解的编译器错误

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

所以,现在我有点困惑,因为

因此,使用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...
}
std::无序映射::常量迭代器;
对于(it=this->mymap.begin();it!=this->mymap.end();++it)
{
//访问它->第一,它->第二等等。。。
}
当OP发现时

有人留下了一个漂亮的
mymap->insert(key,value)
,这是错误的

由于无序映射有一个2参数插入方法

template <class P>
iterator insert(const_iterator hint, P&& obj);
或者用"安放"的方法,


代码似乎将键或值类型视为迭代器。你能告诉我们你是如何使用我的地图的吗;2秒。我真的无法重现这些,你能不能在没有ICU的情况下创建一个更好的?@KennyTM你的提示让我明白了-有人留下了一个漂亮的
mymap->insert(key,value)
,这是错误的-快速更改为使用
operator[]
修复了这些问题。要将您的评论作为答案发布,以便我可以接受吗?他们这样做的标准方法是在全局命名空间中定义一个operator==()版本。不要太相信那个帖子
=
应该在它的一个参数的名称空间中定义,所以ADL会选择它。正如承诺的那样,为迭代器提示打上一个大大的绿色记号。让我看到成员们使用迭代器,然后我想-哦。我们的一些定制容器有
insert(key,val)
原型,并且容器被移动到了C++11,所以。。。问题解决了!谢谢
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...
}
template <class P>
iterator insert(const_iterator hint, P&& obj);
mymap.insert(std::make_pair(key, value));
mymap.emplace(key, value);