2016-11-17 4 views
0

例と既存の演習を見てマルチマップを練習していますが、今はかなり混乱しています。誰でもここでmyMap.erase(iter-> second)で何が消去されているのか教えてもらえますか?マルチマップ - .erase()関数についての不思議

multimap<int, int> myMap; 
    for (int i = 0; i < 3; i += 2) 
     myMap.insert(make_pair(i + 1, i * 2)); 
    for (int i = 0; i < 5; i += 2) 
     myMap.insert(make_pair(i, i + 2)); 

multimap<int, int>::iterator iter = myMap.begin(); 
    ++iter; 
    ++iter; 
    myMap.erase(iter->second); 
    ++iter; 

    cout << iter->first << iter->second << endl; 

これまでのところ私は、マルチセットは、(0,2)、(1,0)、(2,4)、(3,4)、(4,6)であることを知っています。しかし、他の可能なイテレーター位置でペアを印刷しようとしたとき、イテレーターをインクリメントする場合は、myMap.erase(iter->second)行が存在する限り、印刷できなくなりました(4,6)。これはマップ/反復子を参照不可能なエラーに設定しません。

ここでは正確に何が起こっていますか?実際に何が「消去」されたのですか?

答えて

2

マップには、キーと値のペアの要素が含まれています。

eraseは、特定のキーをコンテナから消去することを意図しています。しかし、iter->secondを渡すことによって、3番目の要素の値をerase、つまり4に渡します。

したがって、最後の要素である4のキーを持つ要素が削除されます。その要素を別の++iterで逆参照しようとすると、それはできません。そのアサーションを取得します。


コメント後の詳細説明。

  1. 消去の呼び出し時に、iterは(2,4)要素にあります。
  2. その後、4
  3. eraseは4キーを持つ要素を探して、要素(4,6)を検出し、削除するパラメータでeraseを呼び出し、そのコンテナから
  4. (第4要素とは何の関係も、それは偶然ません)
+0

したがって、文字通り4で(3,4)を取り、「4」番目の要素を別名(4,6)で消去しますか? iteratorがiter-> secondを消去するとき(3、2)オンだった場合、(1,0)の2番目の要素が消去されていたでしょうか? – BaloneyOs

+0

いいえ、それは間違っています、私の編集を参照してください。 – acraig5075

+0

ああ、鍵はペアの最初の要素です。私は何かを消去しようとし、これと一致します。助けてくれてありがとう! – BaloneyOs