17

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

エラー: 'map[name]' の 'operator[]' に一致しません</p>

関数のプロトタイプは次のとおりです。

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

constまた、の前のキーワードを削除しても問題ありませんstd::map

私が正しく指示されていれば、キーが見つからない場合、[] 演算子は実際に新しいペアをマップに挿入します。これはもちろん、これが起こる理由を説明しますが、これが実際に起こるとは想像できません。許容される動作。

[] の代わりにfindを使用するなど、より良い方法があれば、それをいただければ幸いです。ただし、find が機能しないようです... const不一致の反復子エラーが発生します。

4

5 に答える 5

8

operator[] を使用している場合、std::map は指定されたキーを持つアイテムを探します。見つからない場合は作成します。したがって、constの問題。

find メソッドを使用すれば問題ありません。

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

if( map.find(name) != map.end() )
{
   //...
}
于 2009-03-26T22:28:41.403 に答える
4

C++11 を使用している場合は、std::map::atが機能するはずです。

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

ただし、「at」メソッドは、キーが存在しない場合に例外をスローします。そうは言っても、「at」メソッドを使用して要素にアクセスする前に、std::map::find メソッドを使用してキーの存在を確認することをお勧めします。

于 2014-06-04T18:58:18.903 に答える
2

おそらく、std::map に const operator[] がないためです。operator[] は、探している要素が見つからない場合に追加します。したがって、追加の可能性なしで検索したい場合は、find() メソッドを使用してください。

于 2009-03-26T22:29:20.047 に答える