std::map の [] 演算子の宣言は次のとおりです。
T& operator[] ( const key_type& x );
これではない理由はありますか?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
これは、const メソッドでメンバー マップにアクセスする必要があるときはいつでも非常に便利だからです。
C ++ 11の時点でstd::map::at
、constおよびnon-constアクセスを提供するものがあります。
対照的に、要素がマップにない場合は例外operator[]
がスローされます。std::out_of_range
operator[]
マップ内では、指定されたキーの値を返すか、そのキーがまだ存在しない場合は新しい値で初期化された要素を作成するため、不可能です。
operator[]
オーバーロードがある場合const
、要素の追加は機能しません。
それは質問に答えます。代替案:
C++03の場合- イテレータを使用できます (これらはconst
および とconst
結合されていませんfind
)。C++11 では、メソッドを使用できますat
。
これらの答えはoperator[]
、キーが存在しない場合にキーを追加するセマンティクスがあるという点で正しいですが、別の観点を追加したいと思います。
operator[]
を返す方法に注意してくださいT&
。つまり、にvalue
関連付けられているへの参照を返しますkey
。しかし、がない場合はどうkey
なりmap
ますか?何を返せばいいですか?「null参照」のようなものはなく、例外をスローするのは面倒です。
これは、いいえの理由の1つoperator[] const
です。map
(演算子がであるため)に何も追加できなかったconst
が、存在しないアイテムを探している場合、ユーザーに何を返しますか?この問題の良い解決策は、を持たないことoperator[] const
です。
(非const
)operator[]
は、キーが存在しない場合にキーを作成します。
そのconst
演算子のバージョンが存在する場合、新しいキーを追加できないため、異なるセマンティクスを持つ必要があります。
セマンティクスが大きく異なるオーバーロードを持つ場合とない場合は、ワームの缶詰になることconst
に同意していただけると思います。const
したがって、const
バージョンは提供されません。
ただし、 constfind()
メンバーがあるため、コードで使用できます。
のセマンティクスはoperator[]
、キーが存在しない場合にキーを追加するためです。