101

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

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

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

4

8 回答 8

37
auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

我想有一种更清洁的方式来完成同样的事情。但这可以完成工作。

于 2016-07-12T05:53:53.810 回答
28

试试这个:

multiset<int> s;
s.erase(s.lower_bound(value));

只要能保证value存在于集合中。这样可行。

于 2018-11-20T03:44:38.397 回答
4
 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

这是我能想到的在 C++ 中删除多重集中的单个实例的最佳方法

于 2016-07-27T05:30:54.310 回答
2

我会尝试以下。

首先调用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 );
}
于 2012-02-06T21:52:47.050 回答
2

这对我有用:

multi_set.erase(multi_set.find(val));

如果 val 存在于多重集中。

于 2020-01-12T09:39:59.247 回答
0

我们可以这样做:

multiset<int>::iterator it, it1;
it = myset.find(value);
it1 = it;
it1++;
myset.erase (it, it1);
于 2015-12-24T17:38:43.223 回答
0
 auto itr=ms.find(value);  
  while(*itr==value){
  ms.erase(value);
  itr=ms.find(value);  
  }

试试这个 它将删除多集中所有可用的重复项。

于 2020-12-21T09:48:01.517 回答
-3

其实正确答案是:

my_multiset.erase(my_multiset.find(value));
于 2014-09-05T05:18:42.053 回答