C ++ const map元素访问

时间:2011-02-27 17:17:19

标签: c++ stl map const

我尝试使用operator []访问const C ++映射中的元素,但此方法失败。我也尝试用“at()”来做同样的事情。这次工作。但是,我找不到任何关于使用“at()”来访问const C ++映射中的元素的引用。 “at()”是C ++地图中新添加的函数吗?我在哪里可以找到更多关于此的信息?非常感谢你!

一个例子如下:

#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 ::地图,   std :: allocator&gt; &gt;'作为'_Tp&amp;的''''参数   std :: map&lt; _Key,_Tp,_Compare,   _Alloc&gt; :: operator [](const _Key&amp;)[with _Key = int,_Tp = char,_Compare = std :: less,_Alloc =   std :: allocator&gt;]'丢弃限定符

使用的编译器是g ++ 4.2.1

4 个答案:

答案 0 :(得分:103)

at()是C ++ 11中std::map的新方法。

如果具有给定键的元素不存在,则不会将新的默认构造元素作为operator[]插入,而是会抛出std::out_of_range异常。 (这类似于at()deque vector的行为。)

由于这种行为,const的{​​{1}}重载是有意义的,与at()不同,operator[]总是有可能更改地图。

答案 1 :(得分:31)

如果map中不存在某个元素,则operator []会添加它 - 这显然无法在const地图中使用,因此C ++不会定义const }运营商的版本。这是编译器类型检查器防止潜在运行时错误的一个很好的例子。

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

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

答案 2 :(得分:3)

如果给定的密钥不存在,[] -operator将在地图中创建新条目。因此可能会改变地图。

请参阅此link

答案 3 :(得分:2)

这对我来说非常惊讶,但STL地图没有const索引运算符。也就是说,B[3]不能是只读的。从手册:

Since operator[] might insert a new element into the map, it can't possibly be a const member function.

我不知道at()

相关问题