17

传递对 a std::mapas const 的引用会导致 [] 运算符中断是否有原因?使用 const 时出现此编译器错误(gcc 4.2):

错误:“map[name]”中的“operator[]”不匹配</p>

这是函数原型:

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

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

如果我的指示正确,如果 [] 运算符找不到密钥,它实际上会在映射中插入一个新对,这当然可以解释为什么会发生这种情况,但我无法想象这会是可接受的行为。

如果有更好的方法,比如使用find而不是 [],我将不胜感激。我似乎也无法找到工作……我收到const mismatched iterator 错误。

4

5 回答 5

27

是的,您不能使用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_iteratoriterator.

于 2009-03-26T22:30:08.217 回答
8

当您使用 operator[] 时,std::map 会查找具有给定键的项目。如果它没有找到,它会创建它。因此 const 的问题。

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

您能否发布有关您如何尝试使用 find() 的代码?正确的方法是:

if( map.find(name) != map.end() )
{
   //...
}
于 2009-03-26T22:28:41.403 回答
4

如果您使用的是 C++11,则std::map::at应该适合您。

std::map::operator[]不起作用的原因是,如果您要查找的键在地图中不存在,它将使用提供的键插入一个新元素并返回对它的引用(有关详细信息,请参阅链接)。这在 const std::map 上是不可能的。

但是,如果键不存在,'at' 方法将引发异常。话虽如此,在尝试使用 'at' 方法访问元素之前,使用 std::map::find 方法检查密钥是否存在可能是个好主意。

于 2014-06-04T18:58:18.903 回答
2

可能是因为 std::map 中没有 const operator[]。operator[] 将添加您正在寻找的元素,如果它没有找到它。因此,如果您想在不添加的情况下进行搜索,请使用 find() 方法。

于 2009-03-26T22:29:20.047 回答
2

对于您的“常量不匹配迭代器错误”:

find() 有两个重载:

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

我的猜测是你得到这个错误是因为你正在做一些事情,比如为地图find()上的调用结果分配一个非常量迭代器(在左侧) const

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

这将导致错误,尽管可能不是您所看到的错误。

于 2009-03-26T22:34:40.547 回答