2011-12-05 14 views
1

私の要件は、「キー」ではなくマルチマップから「値」を削除することです。 キーは複数の値を持ち、iは特定の値を削除します。私の必要条件は、リンクされたリストからノードを削除するのと似ています。マルチマップから「値」を削除する

multimap::erase()メソッドを使用しています。 しかし、削除後にマルチマップの値を印刷しようとすると、multimap::erase()を使用して削除された値も印刷されます。以下

は私のコードスニペットです:

void Clientqueues::clearSubscription(string name,string sessionid) 
{ 
    pair<multimap<string,string>::iterator,multimap<string,string>::iterator> i; 
    multimap<string, string>::iterator j; 
    i = registeredClientInfo.equal_range(name); 

    if (j == registeredClientInfo.end()) 
      return; 
    for(j=i.first;j != i.second;++j) 
    { 
     if((j->second) == sessionid) registeredClientInfo.erase(j->second); 
    } 

    for(j=i.first;j != i.second;++j) 
    { 
     cout<<""<<j->second<<endl;///This prints the erased values too; 
    } 

} 

私が何か間違ったことをやっていますか? この点に関するお手伝いが大変ありがとうございます。

答えて

1

erase(j)に電話する場合は、erase(j->second)に電話することが最も重要です。 jが指すマルチマップの要素を消去していない場合は、キーがj(つまりsessionid)の要素の値と等しいすべての要素が消去されます。私はそれが何もないと思います。

また:eraseループが完了した後、再びequal_rangeを呼び出す - 消去イテレータを使用することの効果は定義されていませんので、あなたが最初のイテレータi.firstを消去した場合は、その後、再びそこから繰り返しを開始することはできません。それはもはや有効ですイテレータ値を保持しているときにeraseを呼んで行う場合には、あなたがjをインクリメントするので、これはまた、eraseを行い、あなたのループにバグがあるのを意味していること

は注意してください。残念ながら、正しいコードは次のとおりです。

for(j=i.first;j != i.second;) 
{ 
    if((j->second) == sessionid) { 
     auto next = j; 
     ++next; 
     registeredClientInfo.erase(j); 
     j = next; 
    } else { 
     ++j; 
    } 
} 

それとも好む場合:

for(j=i.first;j != i.second;) 
{ 
    auto current = j; 
    ++j; 
    if((current->second) == sessionid) registeredClientInfo.erase(current); 
} 

それともだけで、ほとんど一つのことを削除する必要がありますようにエントリは、キー/値のペアのためのユニークですか、そして:あなたがそれを行うときjが初期化されていないので、

for(j=i.first;j != i.second;++j) 
{ 
    if((j->second) == sessionid) { 
     registeredClientInfo.erase(j); 
     break; 
    } 
} 

if (j == registeredClientInfo.end()) return;は、右のいずれかではありません。キーが見つからない場合、equal_rangeは空の範囲(等しい2つのイテレータ値)を返します。したがって、他のループは何も行いません。

+0

ありがとう、これは私のために働いた。 – user1081481

0

i.firstまたはi.secondを削除した場合、イテレータは無効になり、未定義の動作を意味します。

関連する問題