C ++地图访问丢弃限定符(const)

下面的代码说,将const作为const传递给operator[]方法会抛弃限定符:

 #include <iostream> #include <map> #include <string> using namespace std; class MapWrapper { public: const int &get_value(const int &key) const { return _map[key]; } private: map<int, int> _map; }; int main() { MapWrapper mw; cout << mw.get_value(42) << endl; return 0; } 

这是因为地图访问中可能发生的分配? 没有函数的地图访问被声明为const?

MapWrapper.cpp:10: error: passing 'const std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >' as 'this' argument of '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >]' discards qualifiers

std::mapoperator []没有声明为const ,并且不能由于它的行为:

T&operator [](const Key&key)

返回映射到与键等效的键的值的引用,如果此键尚不存在,则执行插入。

因此,你的函数不能被声明为const ,并使用map的operator[]

std::mapfind()函数允许你在不修改地图的情况下查找关键字。

find()将一个iteratorconst_iterator返回给包含键( .second )和值( .second )的std::pair

在C ++ 11中,你也可以使用at()作为std::map 。 如果元素不存在,则与operator []相比,该函数会抛出std::out_of_rangeexception。

您不能在常量的地图上使用operator [],因为它可以修改地图(您可以指定为_map [key])。 尝试使用find方法。

由于operator[]没有const限定的重载,所以在const限定的函数中不能安全地使用它。 这可能是因为目前的超负荷是以返回和设定关键值为目标而build立的。

相反,您可以使用:

 VALUE = map.find(KEY)->second; 

或者,在C ++ 11中,可以使用at()运算符:

 VALUE = map.at(KEY); 

一些较新版本的GCC头文件(我的机器上的4.1和4.2)有非标准的成员函数map :: at(),这些函数被声明为const,并且如果键不在映射中,则抛出std :: out_of_range。

 const mapped_type& at(const key_type& __k) const 

从该函数的注释中的引用看来,这已经被build议作为标准库中的新成员函数。

首先,你不应该使用以_开头的符号,因为它们被保留给语言实现/编译器编写器。 _map对于某个人的编译器来说是一个语法错误,这是非常容易的,除了你自己之外,你将没有人责怪。

如果你想使用下划线,把它放在最后,而不是开始。 你可能犯了这个错误,因为你看到了一些微软的代码。 请记住,他们编写自己的编译器,以便他们能够摆脱它。 即便如此,这是一个坏主意。

operator []不仅返回一个引用,它实际上在地图上创build了条目。 所以你不只是得到一个映射,如果没有,你正在创build一个。 这不是你想要的。