在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(值));