时有一个原因传递一个参照本发明的std::map为const使[]操作破?我得到这个编译器错误(GCC 4.2)当我使用常量:

  

错误:在没有匹配关于“操作符[]”   “映射[名称]”

这里的函数原型:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

和,我应该指出,是没有问题的,当我除去const关键字std::map的前面。

如果我已经正确指示,[]操作实际上将插入一个新的对进入地图,如果它没有找到问题的关键,这当然会解释为什么出现这种情况,但我无法想象,这个将永远是可接受的行为。

如果有一个更好的方法,例如使用找到代替[],我将不胜感激。我似乎无法得到找到工作,要么虽然...我收到的常量的迭代器不匹配的错误。

有帮助吗?

解决方案

是你不能使用operator[]。使用find,但要注意它返回const_iterator代替iterator的:

std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

这就像与指针。您不能分配给int const* int*。同样地,可以不分配给const_iterator iterator

其他提示

当你使用操作符[]的std ::地图查找与给定的关键项目。如果没有发现任何,它会创建它。因此,问题常量。

使用find方法,你会没事的。

能否请您发表你如何试图使用find()方法的代码? 以正确的方式将是:

if( map.find(name) != map.end() )
{
   //...
}

大概是因为不存在操作者常量[]中的std ::地图。运营商[]将增加你正在寻找,如果没有找到它的元素。因此,如果你想不增加的可能性搜索使用find()方法。

有关你的 “常量不匹配的迭代器错误”:

查找()具有两个重载:

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

我的的猜测的是你,因为你正在做的事情一样分配非const迭代器(左)到find()地图上的const调用的结果收到此错误:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

这将导致一个错误,虽然可能不是你所看到的一个。

scroll top