是否有理由将const std::map
的引用作为const传递导致[]运算符中断?当我使用const:
错误:不匹配'operator []' “映射[名称]”
这是函数原型:
void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);
而且,我应该提一下,当我删除const
前面的std::map
关键字时没有问题。
如果我被正确指示,如果没有找到键,[]运算符实际上会将新对插入到地图中,这当然可以解释为什么会发生这种情况,但我无法想象这一点永远是可接受的行为。
如果有更好的方法,比如使用 find 而不是[],我会很感激。我似乎无法找到工作,但是...我收到 const 不匹配的迭代器错误。
答案 0 :(得分:26)
是的,您无法使用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
。
答案 1 :(得分:7)
当你使用operator []时,std :: map会查找具有给定键的项目。如果找不到,则创建它。因此const。
的问题使用find方法,你会没事的。
您能否发布有关如何使用find()的代码? 正确的方法是:
if( map.find(name) != map.end() )
{
//...
}
答案 2 :(得分:3)
如果您使用的是C ++ 11,std::map::at应该适合您。
std::map::operator[]不起作用的原因是,如果您正在寻找地图中不存在的密钥,它将使用提供的密钥插入新元素并返回对它的引用(有关详细信息,请参阅链接。这在const std :: map上是不可能的。
但是,如果密钥不存在,'at'方法将抛出异常。话虽这么说,在尝试使用'at'方法访问元素之前,使用std :: map :: find方法检查密钥的存在可能是个好主意。
答案 3 :(得分:2)
可能是因为std :: map中没有const运算符[]。 operator []将添加您正在寻找的元素,如果它找不到它。因此,如果要在不添加的情况下进行搜索,请使用find()方法。
答案 4 :(得分:2)
对于“const不匹配的迭代器错误”:
find()有两个重载:
iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;
我的猜测是你得到这个错误,因为你正在做一些事情,比如将一个非const迭代器(在左边)分配给find()
调用的结果const
地图:
iterator<...> myIter /* non-const */ = myConstMap.find(...)
这会导致错误,但可能不是您所看到的错误。