C ++のconstのstd ::マップ参照は、コンパイルに失敗します
-
22-08-2019 - |
質問
constの[]は、オペレータが破損する原因となるようstd::map
への参照を渡す理由はありますか?私は、このコンパイラエラー(GCC 4.2)を取得私はconstとして使用する場合:
エラー:「[]演算子」の一致なしで 「[名]マップ」
ここでは、関数のプロトタイプです:
void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);
そして、私は私がconst
の前でstd::map
キーワードを削除する際に問題がないことを言及する必要があります。
、[]演算子は、実際にマップに新しいペアを挿入しますが、私はこのことを想像することはできません今まで許容動作になります。
代わりに[]でを見つける使用してのような、より良い方法がある場合、私はそれを感謝します。私は仕事のどちらかしかし...私が受け取ることを見つけるように見えることはできませんのconstのの不一致イテレータエラーます。
解決
はい、あなたはoperator[]
を使用することはできません。 find
を使用しますが、それはconst_iterator
の代わりにiterator
を返す注意します:
std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
std::string const& data = it->second;
// ...
}
これは、ポインタを持つようなものです。あなたはint const*
にint*
を割り当てることはできません。同様に、あなたはconst_iterator
にiterator
を割り当てることはできません。
他のヒント
演算子[]、のstd ::マップが与えられたキーで項目を探します。それがいずれも見つからない場合は、それを作成します。したがって、constのに問題ます。
を使用する方法を見つけ、あなたは大丈夫です。
あなたはどのように検索を()を使用しようとしている上のコードを投稿してくださいことはできますか? 正しい方法は次のようになります:
if( map.find(name) != map.end() )
{
//...
}
あなたはC ++ 11、のstd ::マップを使用している場合は::でのはあなたのために働く必要があります。
理由のstd ::地図::演算子[] は機能しません(詳細については、リンクを参照してください)あなたがマップに存在していない探しているキーの場合には、それが提供するキーを使用して新しい要素を挿入し、それへの参照を返すことです。これは、constのはstd ::地図上不可能です。
キーが存在しない場合の方法「で」、しかし、例外がスローされます。それは::「での」メソッドを使用して要素にアクセスしようとする前に方法を見つけるだろうSTD ::マップを使用して、キーの存在を確認することをお勧めし、言われています。
何のconst演算子[]のstd ::マップ内に存在しないおそらくので。それが見つからない場合は、オペレータは、[]あなたが探している要素を追加します。あなたは追加の可能性なしに検索したい場合はそのため、find()メソッドを使用します。
あなたの "constの不一致イテレータエラー" の場合:
見つける()は、2つのオーバーロードがあります:
iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;
私のの推測のあなたはfind()
マップ上const
呼び出しの結果に(左側)非constイテレータを割り当てるようなものをやっているので、あなたはこのエラーを取得しているということです。
iterator<...> myIter /* non-const */ = myConstMap.find(...)
あなたが見ている1おそらくしていないが、エラーになるだろうと。