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_rangeexception。 (这与dequevectorat()的行为类似。)

由于这种行为,有一个const重载的at()是有意义的,不像operator[]总是有可能改变地图。

如果一个元素不存在于一个mapoperator []将会添加它 – 这显然不能在const映射中工作,所以C ++没有定义一个const的操作符版本。 这是编译器types检查器防止潜在运行时错误的一个很好的例子。

在你的情况下,你需要使用find ,它只会返回一个(迭代器)元素,如果它存在,它将永远不会修改map 。 如果一个项目不存在,它将一个迭代器返回到地图的end()

at不存在,甚至不应该编译。 也许这是一个“编译器扩展”(= 一个错误 新的C + + 0x)。

如果给定的键不存在,[]操作员将在映射中创build一个新条目 。 它可能因此改变地图。

看到这个链接 。

这对我来说是一个惊喜,但是STL映射没有const索引操作符。 也就是说, B[3]不能是只读的。 从手册:

由于operator []可能会在地图中插入一个新元素,因此它不可能是一个const成员函数。

at()我不知道。