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

In std::multiset is there a function or algorithm to erase just one sample (unicate or duplicate) if an element is found

本文关键字:一个 擦除 样本 单播 算法 函数 multiset 如果 有一个 元素 std      更新时间:2023-10-16

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

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

我想还有一种更清洁的方式来实现同样的目标。但这就完成了任务。

试试这个:

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

只要您能够确保value存在于集合中。这很管用。

 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

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

这对我有效:

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

如果val存在于多集中。

我会尝试以下操作。

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

如果返回的范围不是空的,则erase()是元素的范围(即采用两个迭代器的erase()),其中:

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

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


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

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

伪代码:

pair<iterator, iterator> pit = mymultiset.equal_range( key );
if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}

由于C++17(请参阅此处):

mySet.extract(val);

我们可以这样做:

multiset<int>::iterator it, it1;
it = myset.find(value);
it1 = it;
it1++;
myset.erase (it, it1);

这里有一个使用"if语句与初始值设定项";在C++17:中引入

if(auto it = mySet.find(value); it != mySet.end())
    mySet.erase(value);

这种语法的优点是迭代器it的作用域被缩减为这个if语句。

 auto itr=ms.find(value);  
  while(*itr==value){
  ms.erase(value);
  itr=ms.find(value);  
  }

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

事实上,正确的答案是:

my_multiset.erase(my_multiset.find(value));