C ++ const std :: map引用无法编译

时间:2009-03-26 22:26:03

标签: c++ find std operator-keyword stdmap

是否有理由将const std::map的引用作为const传递导致[]运算符中断?当我使用const:

时,我得到了这个编译器错误(gcc 4.2)
  

错误:不匹配'operator []'   “映射[名称]”

这是函数原型:

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

而且,我应该提一下,当我删除const前面的std::map关键字时没有问题。

如果我被正确指示,如果没有找到键,[]运算符实际上会将新对插入到地图中,这当然可以解释为什么会发生这种情况,但我无法想象这一点永远是可接受的行为。

如果有更好的方法,比如使用 find 而不是[],我会很感激。我似乎无法找到工作,但是...我收到 const 不匹配的迭代器错误。

5 个答案:

答案 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(...)

这会导致错误,但可能不是您所看到的错误。