2011-04-29 10 views
2

私は、C++マップのデータを比較するメンバー関数を持っています。すぐに私がアクセスし、私はMYMAPが一定であることについてコンパイルエラーを取得した値を比較するMYMAP [「L」]を使うよう"const"メンバ関数でコンパイラエラーを取得せずにC++マップの値をチェックする方法はありますか?

bool operator == (UnitSet otherSet) const; 

しかし:私は、メンバ関数は、定数として宣言しました。 constディレクティブを維持しながらこれを回避する方法はありますか?

"l"キーが存在しない場合は空の値が作成されていますが、それは私のユニットセットの値/動作を変更しません - おそらく私もそうしようとしていますここでピックアップし、ちょうど "const"を落とすべきです。これについての良い方法は何ですか?

ありがとうございました。

答えて

3

std::map残念ながら、[]演算子のオーバーロードはありません(const)。これは、存在しないキーにアクセスするたびにマップが要素を作成するためです。地図がconstだったら、それは不可能です。したがって、定数マップで呼び出す方法はありません。あなたのUnitSetクラスの動作とは関係ありません。

要素に反復子を取得するにはmyMap.find(TKey)を使用する必要があります。見つからない場合はmyMap.end()を返します。

マップイテレータは、キーと値のstd::pairを指しているため、secondのメンバーにアクセスして値(firstをキーにする)を取得する必要があります。

const UnitSet& reference = myMap.find("l")->second; 
4

まず、あなたがそれをコピーする必要がないし、それを修正することはありませんよう、const参照によってotherSetを受け入れるように関数のシグネチャを変更する必要があります。そして、

bool operator==(const UnitSet& otherSet) const; 

ではなく、使用してconstoperator[]を入力してください。find()またはbegin()/!=end()/++を入力してmapmapに入力して比較してください。 find()begin()、およびconst_iteratorの操作ではconstへのアクセスがmapに限定されているため、メンバー関数constから使用できます。

map<X, Y>::const_iterator i = the_map.find(key); 
if (i != the_map.end()) 
    // here, i->first is the key, i->second is the value 
else 
    // key wasn't in the map after all... 
+0

参考にしても良い点は、obj-cの背景から来ている値などを渡すオブジェクトが初めてのことです。 –

関連する問題