1. ホーム
  2. c++

[解決済み] Constマップ要素へのアクセス

2022-08-09 04:51:02

質問

私は 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: error: Pass 'const std::map<int, char, std::less, std::allocator<std::pair<const int, char> > >' を '_Tp&' の 'this' 引数として渡す。 std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = char, _Compare = std::less, _Alloc = std::allocator<std::pair<constのint, char> >]' は、修飾語を破棄します。

使用したコンパイラはg++ 4.2.1です。

どのように解決するのですか?

at() は、新しいメソッドで std::map の新しいメソッドです。

として新しいデフォルトの構成要素を挿入するのではなく operator[] のように新しいデフォルトの要素を挿入するのではなく、与えられたキーを持つ要素が存在しない場合は std::out_of_range 例外を投げます。(の挙動に似ています)。 at() に対して dequevector .)

このような動作のために const のオーバーロード at() とは異なり operator[] とは異なり、常にマップを変更する可能性を持っています。