在std :: multiset中,如果找到一个元素,则只有一个函数或算法可以擦除一个样本(单元或重复)

时间:2012-02-06 21:46:59

标签: c++ stl multiset

也许这是重复但我找不到任何搜索: 在erase(value)上调用std::multiset时,会删除所有找到值的元素。我能想到的唯一解决方案是:

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

这没关系,但我认为可能会更好。任何想法?

8 个答案:

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