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::map
的operator []
没有声明为const
,并且不能由于它的行为:
T&operator [](const Key&key)
返回映射到与键等效的键的值的引用,如果此键尚不存在,则执行插入。
因此,你的函数不能被声明为const
,并使用map的operator[]
。
std::map
的find()
函数允许你在不修改地图的情况下查找关键字。
find()
将一个iterator
或const_iterator
返回给包含键( .second
)和值( .second
)的std::pair
。
在C ++ 11中,你也可以使用at()
作为std::map
。 如果元素不存在,则与operator []
相比,该函数会抛出std::out_of_range
exception。
您不能在常量的地图上使用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一个。 这不是你想要的。