C ++常量映射元素访问
我尝试使用operator []访问const C ++映射中的元素,但此方法失败。 我也试图用“at()”来做同样的事情。 它这次工作。 但是,我找不到有关使用“at()”访问const C ++映射中的元素的任何参考。 “()”是C ++ map中新增的函数吗? 我在哪里可以find更多关于这个的信息? 非常感谢你!
一个例子可能如下:
#include <iostream> #include <map> using namespace std; int main() { map<int, char> A; A[1] = 'b'; A[3] = 'c'; const map<int, char> B = A; cout << B.at(3) << endl; // it works cout << B[3] << endl; // it does not work }
对于使用“B [3]”,它在编译期间返回了以下错误:
t01.cpp:14:error:传递'const std :: map,std :: allocator>>'作为'_Tp&std :: map <_Key,_Tp,_Compare,_Alloc> ::运算符的参数。 const _Key&)[与_Key = int,_Tp = char,_Compare = std :: less,_Alloc = std :: allocator>]放弃限定符
使用的编译器是g ++ 4.2.1
at()
是C ++ 11中std::map
的新方法。
如果一个具有给定键的元素不存在,那么不会像operator[]
那样插入一个新的默认构造元素,而是抛出一个std::out_of_range
exception。 (这与deque
和vector
的at()
的行为类似。)
由于这种行为,有一个const
重载的at()
是有意义的,不像operator[]
总是有可能改变地图。
如果一个元素不存在于一个map
, operator []
将会添加它 – 这显然不能在const
映射中工作,所以C ++没有定义一个const
的操作符版本。 这是编译器types检查器防止潜在运行时错误的一个很好的例子。
在你的情况下,你需要使用find
,它只会返回一个(迭代器)元素,如果它存在,它将永远不会修改map
。 如果一个项目不存在,它将一个迭代器返回到地图的end()
。
at
不存在,甚至不应该编译。 也许这是一个“编译器扩展”(= 一个错误 新的C + + 0x)。
如果给定的键不存在,[]操作员将在映射中创build一个新条目 。 它可能因此改变地图。
看到这个链接 。
这对我来说是一个惊喜,但是STL映射没有const
索引操作符。 也就是说, B[3]
不能是只读的。 从手册:
由于operator []可能会在地图中插入一个新元素,因此它不可能是一个const成员函数。
at()
我不知道。