在std :: multiset中是否有一个函数或algorithm来删除一个样本(unicate或duplicate),如果一个元素被find

也许这是一个重复,但我没有find任何search:当在std::multiset上调用erase(value)时,find的所有元素都被删除。 我能想到的唯一解决scheme是:

 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); } 

我会想象有一个更干净的方式来完成相同的。 但是这完成了工作。

我会尝试以下。

首先调用equal_range()来查找等于键的元素的范围。

如果返回的范围是非空的,那么erase()一系列元素(即erase() ,其中需要两个迭代器),其中:

  • 第一个参数是返回到第二个元素的迭代器返回的范围(即一个过去.first返回)和

  • 第二个参数作为返回的范围对迭代器的第二个参数。


阅读templatetypedef后(编辑)(谢谢!)评论:

如果应该删除一个(而不是所有)重复:如果equal_range()返回的对至less有两个元素,则通过将返回的对的.first传递给单个迭代器版本来erase()第一个元素的erase()

伪代码:

 pair<iterator, iterator> pit = mymultiset.equal_range( key ); if( distance( pit.first, pit.second ) >= 2 ) { mymultiset.erase( pit.first ); } 
 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 ++中的单个实例

其实正确的答案是:

my_multiset.erase(my_multiset.find(值));