C ++常量性病::地图参考编译失败
-
22-08-2019 - |
题
时有一个原因传递一个参照本发明的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() )
{
//...
}
如果您使用C ++ 11,的std ::映射::在应该为你工作。
在“在”方法,但是,将引发异常,如果密钥不存在。话虽这么说,它可能是检查使用的std ::地图键的存在是一个好主意::试图访问使用“在”方法的元素之前找到方法。
大概是因为不存在操作者常量[]中的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(...)
这将导致一个错误,虽然可能不是你所看到的一个。