14


3

C const std :: map参照がコンパイルに失敗する
constとして `std

map`への参照を渡すと[]演算子が壊れるのには理由がありますか? constを使用すると、このコンパイラエラー(gcc 4.2)が発生します。

_ エラー:「map [name]」の「operator []」に一致しません _

これが関数のプロトタイプです。

void func(const char ch, std::string &str, const std::map &map);
そして、私は `std

map`の前にある` const`キーワードを削除しても問題ないことを述べておくべきです。

正しく指示されていれば、[]演算子はキーが見つからない場合に実際に新しいペアをマップに挿入します。許容できる動作

[]の代わりに_find_を使うようなもっと良い方法があるなら、私はそれをいただければ幸いです。 私はどちらにしてもうまくいくように思えないようです… _const_不一致の反復子エラーが発生します。

5 回答


26


はい、 `+ operator [] `は使用できません。 ` find `を使用しますが、 ` iterator `の代わりに ` const_iterator +`を返すことに注意してください。

std::map::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

それはポインタのようです。 `+ int const * `を ` int * `に割り当てることはできません。 同様に、 ` const_iterator `を ` iterator +`に割り当てることはできません。


7


operator []を使用している場合、std

mapは与えられたキーを持つアイテムを探します。 見つからない場合は作成します。 したがって、constの問題です。

findメソッドを使うと大丈夫でしょう。

find()をどのように使用しようとしているかについてコードを投稿してください。 正しい方法は次のとおりです。

if(map.find(name)!= map.end()){// ... }


3


C 11を使用している場合は、 std::map::atが役に立ちます。

http://www.cplusplus.com/reference/map/map/operator%5B%5D/[std

map :: operator []]が機能しないのは、あなたが鍵の場合にはマップに存在しないものを探して、それは提供されたキーを使って新しい要素を挿入し、それへの参照を返します(詳細についてはリンクを見てください)。 これはconst std :: mapでは不可能です。

ただし、 'at’メソッドはキーが存在しない場合に例外をスローします。 そうは言っても、 'at’メソッドを使用して要素にアクセスしようとする前に、std

map :: findメソッドを使用してキーの存在を確認することをお勧めします。


2


おそらくstd

mapにconst operator []がないからです。 operator []はあなたが探している要素が見つからなければそれを追加します。 そのため、追加することなく検索したい場合はfind()メソッドを使用してください。


2


あなたの "const mismatched iterator errors"に対して:

find()には2つのオーバーロードがあります。

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

私の_guess_は、(左側の)非定数イテレータを ` const `マップの ` find()+`呼び出しの結果に割り当てるようなことをしているため、このエラーが発生しているということです:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

おそらくそれはエラーになりますが、おそらくあなたが見ているものではありません。