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です
at()
は、C++ 11の_std::map
_の新しいメソッドです。
指定されたキーを持つ要素が存在しない場合に_operator[]
_のように新しいデフォルトの構築要素を挿入するのではなく、_std::out_of_range
_例外をスローします。 (これは、deque
およびvector
に対するat()
の動作に似ています。)
この動作のため、常にマップを変更する可能性がある_operator[]
_とは異なり、at()
のconst
オーバーロードがあるのは理にかなっています。
エレメントがmap
に存在しない場合、 _operator []
_ が追加されます。これは明らかにconst
マップでは機能しないため、C++は機能しませんconst
バージョンの演算子を定義します。これは、潜在的なランタイムエラーを防止するコンパイラの型チェッカーの良い例です。
あなたの場合、代わりに find
を使用する必要があります。これはonlyが(イテレータへ)を返します要素が存在する場合、map
は変更されません。アイテムが存在しない場合は、マップのend()
への反復子を返します。
at
は存在せず、コンパイルすらすべきではありません。おそらくこれは「コンパイラ拡張機能」(= バグ C++ 0xの新機能)。
[] -operatorは、指定されたキーが存在しない場合、マップに新しいエントリを作成します。したがって、マップが変更される場合があります。
こちらをご覧ください link 。
これは非常に驚きですが、STLマップにはconst
インデックス演算子がありません。つまり、_B[3]
_を読み取り専用にすることはできません。マニュアルから:
operator []はマップに新しい要素を挿入する可能性があるため、constメンバー関数になることはできません。
at()
についてはわかりません。