2012-02-20 16 views
2

オブジェクトをキーとしてイテレータをSTLマップから返すことに問題があります。オブジェクトをキーとして使用するときにSTLマップからイテレータを返す

map.insert()を実行するだけでコードはコンパイルされますが、map.insert()から返されたイテレータを使用しようとしている行はコンパイルされません。

コンパイラエラーが「エラー: 『演算子=』の不一致」である

すぐ下のコードスニペットでreturn文の前に問題のある行を参照してください。

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

#include <map> 
using namespace std; 

class Keys { 
public: 
    Keys(int k1, int k2) : 
     key1(k1), key2(k2) { 
    } 
    bool operator<(const Keys &right) const { 
     return (key1 < right.key1 && key2 < right.key2); 
    } 
    int key1; 
    int key2; 
}; 

int main() { 
    std::map<Keys, int> mymap; 
    map<Keys,int>::iterator myitr; 
    mymap.insert(std::pair<Keys, int>(Keys(3, 8), 5)); 
    myitr = mymap.insert(std::pair<Keys, int>(Keys(1, 2), 3)); 
    return 0; 
} 

答えて

2

あなたは使用する必要があります。

pair<map<Keys,int>::iterator,bool> ret; 
ret = mymap.insert(std::pair<Keys, int>(Keys(1, 2), 3)); 

std::map::insert()ドキュメントの戻り値を注意してください。

+4

彼は 'のstdを使用することができ:: make_pair(キーズ(1、2)、3)'の代わりに ':だから

std::map<>::iterator std::map::insert(iterator _where, value_type val); 

を、あなたのコードは次のようになります必要がありますstd :: pair (キー(1,2)、3) ' – Nawaz

+0

迅速で有益な応答をありがとう。私はオブジェクト内に複数のキーを追加する過程でマルチマップから切り替えていましたが、マップとマルチマップ間の戻り値の差を偶然に見逃しました。 – ManNamedJed

+0

@Nawaz:確かに可能です。私はOPに 'std :: map'を使う方法を学んでいると思いますし、ユーティリティ関数' make_pair()ではなく 'pair'を使って試してみたいと思います。 'これは、より良い選択肢です。 –

1

イテレータを返すstd :: mapの適切なオーバーロード機能を使用する必要があります。 今のところ、1つのパラメータでstd :: map :: insertを使用していて、std :: pairではなくイテレータを返します。 あなたは、この使用する必要があります。

myitr = mymap.insert(std::begin(mymap), std::make_pair(Keys(1, 2), 3)); 
関連する問題