101

おそらくこれは重複していますが、何も検索していませんでした:erase(value)が呼び出されたときstd::multisetに、見つかった値を持つすべての要素が削除されます。私が考えることができる唯一の解決策は次のとおりです。

std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);

これは大丈夫ですが、もっと良いかもしれないと思いました。何か案は ?

4

8 に答える 8

4
 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

これは、C ++でマルチセット内の単一のインスタンスを削除するために私が考えることができる最良の方法です

于 2016-07-27T05:30:54.310 に答える
2

私は次のことを試してみます。

equal_range()キーに等しい要素の範囲を見つけるための最初の呼び出し。

返された範囲が空でない場合はerase()、要素の範囲 (つまり、erase()2 つの反復子を取る )。

  • 最初の引数は、返された範囲の 2 番目の要素へのイテレータ (つまり、返された 1 つ前.first) であり、

  • 2 番目の引数は、返された範囲ペアの反復子の.second1 つです。


templatetypedefの (Thanks!) コメントを読んだ後に編集します。

(すべてではなく) 1 つの重複が削除されることになっている場合: によって返されるペアにequal_range()少なくとも 2 つの要素がある場合、返されたペアerase()の .first を の単一イテレータ バージョンに渡すことによる最初の要素erase():

擬似コード:

pair<iterator, iterator> pit = mymultiset.equal_range( key );

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}
于 2012-02-06T21:52:47.050 に答える