也许这是重复但我找不到任何搜索:
在erase(value)
上调用std::multiset
时,会删除所有找到值的元素。我能想到的唯一解决方案是:
std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);
这没关系,但我认为可能会更好。任何想法?
答案 0 :(得分:20)
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
my_multiset.erase(itr);
}
我认为有一种更清洁的方法来实现同样的目标。但这可以完成工作。
答案 1 :(得分:2)
尝试这个:
multiset<int> s;
s.erase(s.lower_bound(value));
只要您可以确保value
退出集合即可。可行。
答案 2 :(得分:1)
我会尝试以下方法。
首先调用equal_range()
以查找与键相等的元素范围。
如果返回的范围是非空的,那么erase()
一系列元素(即带有两个迭代器的erase()
)其中:
第一个参数是返回的第二个元素的迭代器
范围(即返回过去.first
)和
第二个参数作为返回范围对迭代器的.second
一个。
阅读templatetypedef之后编辑(谢谢!)评论:
如果应该删除一个(而不是全部)副本:如果equal_range()
返回的对具有至少两个元素,那么erase()
第一个元素通过传递.first返回的对是erase()
的单迭代器版本:
的伪代码:
pair<iterator, iterator> pit = mymultiset.equal_range( key );
if( distance( pit.first, pit.second ) >= 2 ) {
mymultiset.erase( pit.first );
}
答案 3 :(得分:1)
multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;
答案 4 :(得分:1)
if(my_multiset.find(key)!=my_multiset.end())
my_multiset.erase(my_multiset.equal_range(key).first);
这是我能想到的在c ++中删除多个集中的单个实例的最佳方法
答案 5 :(得分:1)
这对我有用:
multi_set.erase(multi_set.find(val));
如果val存在于多集中。
答案 6 :(得分:0)
auto itr=ms.find(value);
while(*itr==value){
ms.erase(value);
itr=ms.find(value);
}
试试这个,它将删除多重集中可用的所有重复项。
答案 7 :(得分:-3)
事实上,正确的答案是:
my_multiset.erase(my_multiset.find(值));