web-dev-qa-db-ja.com

std :: multisetには、要素が見つかった場合に1つのサンプル(単一または重複)のみを消去する関数またはアルゴリズムがあります

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

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

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

56
Martin
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

同じことを達成するよりクリーンな方法があると思います。しかし、これで仕事は完了です。

21
user2251346

これを試してください:

multiset<int> s;
s.erase(s.lower_bound(value));

valueがセット内に存在することを確認できる限り。動作します。

6
Strange
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
1
knock_out
 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

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

1

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

最初にequal_range()を呼び出して、キーに等しい要素の範囲を見つけます。

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

  • 最初の引数は、返された範囲の2番目の要素(つまり、_.first_が過去に1つ返された)の反復子です。

  • 返される範囲ペア反復子の_.second_ oneとしての2番目の引数。


templatetypedef 's(Thanks!)コメントを読んだ後に編集:

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

擬似コード:

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

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}
_
1
Arun