おそらくこれは重複していますが、何も検索していませんでした:erase(value)
が_std::multiset
_で呼び出されると、見つかった値を持つすべての要素が削除されます。私が考えることができる唯一の解決策は次のとおりです。
_std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
_
これは大丈夫ですが、もっと良いかもしれないと思いました。何か案は ?
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
my_multiset.erase(itr);
}
同じことを達成するよりクリーンな方法があると思います。しかし、これで仕事は完了です。
これを試してください:
multiset<int> s;
s.erase(s.lower_bound(value));
value
がセット内に存在することを確認できる限り。動作します。
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
if(my_multiset.find(key)!=my_multiset.end())
my_multiset.erase(my_multiset.equal_range(key).first);
これは、C++でマルチセットの単一のインスタンスを削除するために考えることができる最良の方法です
私は次のことを試してみます。
最初に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 );
}
_