关于stl:C ++ const map元素访问

C++ const map element access

我试图使用操作符[]访问const C++映射中的元素,但是这个方法失败了。我还试图用"at()"来做同样的事情。这次成功了。但是,在const C++映射中,我找不到任何关于使用"AT-()"来访问元素的引用。"+"是C++映射中新增的函数吗?我在哪里可以找到更多关于这个的信息?非常感谢你!

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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: passing ‘const
std::map,
std::allocator > >’ as ‘this’ argument of ‘_Tp&
std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = char, _Compare = std::less, _Alloc =
std::allocator >]’ discards qualifiers

使用的编译器是G++4.2.1


EDCOX1〔10〕是C++ 11中EDCOX1×12的一种新方法。

如果具有给定键的元素不存在,则不会像operator[]那样插入新的默认构造元素,而是抛出std::out_of_range异常。(这与dequevectorat()的行为相似。)

由于这种行为,出现at()过载是有道理的,不像operator[]总是有可能改变地图。


如果一个元素不存在于EDCOX1 0中,EDCOX1 OR 1将添加它——它显然不能在EDCOX1×2×map中工作,所以C++不定义操作符的EDCOX1×2版本。这是一个很好的编译器类型检查程序示例,可以防止潜在的运行时错误。

在您的例子中,您需要使用find,它只返回(迭代器到)元素(如果它存在),它将永远不会修改map。如果一个项不存在,它将向映射的end()返回一个迭代器。

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


如果给定的键不存在,则[]-运算符将在映射中创建一个新条目。因此,它可能会改变地图。

请参见此链接。


这让我很惊讶,但是STL映射没有const索引操作符。也就是说,B[3]不能是只读的。从手册中:

由于运算符[]可能会向映射中插入新元素,因此它不可能是常量成员函数。

我不知道at()