我尝试使用 operator[]
访问 const map
中的元素,但此方法失败。我也尝试使用 at()
来做同样的事情。这次奏效了。但是,我找不到任何关于使用 at()
访问 const map
中的元素的参考资料。 at()
是 map
中新增的功能吗?我在哪里可以找到有关此的更多信息?非常感谢!
一个例子可能如下:
#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: 错误: 传递 'const std::map
使用的编译器是g++ 4.2.1
at()
是 C++11 中 std::map
的新方法。
如果具有给定键的元素不存在,它不会像 operator[]
那样插入新的默认构造元素,而是会引发 std::out_of_range
异常。 (这类似于 deque
和 vector
的 at()
行为。)
由于这种行为,at()
的 const
重载是有意义的,这与 operator[]
不同,它总是有可能更改地图。
如果 map
中不存在某个元素,则 operator []
将添加它——这显然不能在 const
映射中工作,因此 C++ 没有定义运算符的 const
版本。这是编译器类型检查器防止潜在运行时错误的一个很好的例子。
在您的情况下,您需要使用 find
代替它仅返回一个(迭代器到)元素(如果存在),它永远不会修改 map
。如果项目不存在,它会返回一个指向地图 end()
的迭代器。
at
不存在,甚至不应该编译。也许这是一个“编译器扩展”(= 一个错误 C++0x 中的新功能)。
这让我很吃惊,但是 STL 映射没有 const
索引运算符。也就是说,B[3]
不能是只读的。从手册:
我不知道at()
。
at()
。我以为这意味着我没有使用 C++11……但是它编译……??