web-dev-qa-db-ja.com

C ++ constマップ要素へのアクセス

Const C++マップの要素にアクセスするoperator []を使用しようとしましたが、このメソッドは失敗しました。また、「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 :: map、std :: allocator>>'を '_Tp&std :: map <_Key、_Tp、_Compare、_Alloc> :: operator []( const _Key&)[with _Key = int、_Tp = char、_Compare = std :: less、_Alloc = std :: allocator>] 'は修飾子を破棄します

使用されるコンパイラはg ++ 4.2.1です

85
icephere

at() は、C++ 11の_std::map_の新しいメソッドです。

指定されたキーを持つ要素が存在しない場合に_operator[]_のように新しいデフォルトの構築要素を挿入するのではなく、_std::out_of_range_例外をスローします。 (これは、dequeおよびvectorに対するat()の動作に似ています。)

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

108
CB Bailey

エレメントがmapに存在しない場合、 _operator []_ が追加されます。これは明らかにconstマップでは機能しないため、C++は機能しませんconstバージョンの演算子を定義します。これは、潜在的なランタイムエラーを防止するコンパイラの型チェッカーの良い例です。

あなたの場合、代わりに find を使用する必要があります。これはonlyが(イテレータへ)を返します要素が存在する場合、mapは変更されません。アイテムが存在しない場合は、マップのend()への反復子を返します。

atは存在せず、コンパイルすらすべきではありません。おそらくこれは「コンパイラ拡張機能」(= バグ C++ 0xの新機能)。

32
Konrad Rudolph

[] -operatorは、指定されたキーが存在しない場合、マップに新しいエントリを作成します。したがって、マップが変更される場合があります。

こちらをご覧ください link

3
vidstige

これは非常に驚きですが、STLマップにはconstインデックス演算子がありません。つまり、_B[3]_を読み取り専用にすることはできません。マニュアルから:

operator []はマップに新しい要素を挿入する可能性があるため、constメンバー関数になることはできません。

at()についてはわかりません。

2
Beta