迭代时从stl列表中删除多个元素

时间:2015-04-22 16:00:44

标签: c++ list stl erase removeall

这与Can you remove elements from a std::list while iterating through it?不相似。我的情况不同。

假设我有一个这样的清单。

1  2  3  1  2  2  1  3

我想以这样的方式迭代这个stl列表 当我第一次遇到元素X时,我会做一些活动,然后我需要删除该列表中的所有元素X并继续迭代。什么是在c ++中这样做的有效方法。

我担心当我执行删除或擦除时,我将使迭代器无效。如果它只是一个元素,那么我可能会增加迭代器然后擦除。但在我的场景中,我需要删除/删除所有的出现。

想到这样的事情

while (!list.empty()) {
   int num = list.front();
   // Do some activity and if successfull
   list.remove(num);
   }

不知道这是否是最好的。

1 个答案:

答案 0 :(得分:-1)

保存一组看到的数字,如果您在集合中遇到一个数字,请忽略它。您可以执行以下操作:

list<int> old_list = {1, 2, 3, 1, 2, 2, 1, 3};
list<int> new_list;
set<int> seen_elements;
for(int el : old_list) {
  if (seen_elements.find(el) == seen_elements.end()) {
    seen_elements.insert(el);
    new_list.push_back(el);
  }
}
return new_list;

这将只处理每个值一次,new_list将只包含old_list中每个元素的第一个副本。这在O(n * log(n))中运行,因为每次迭代都执行set lookup(您可以使用hashset来生成此O(n))。这明显优于您的方法运行的O(n ^ 2)。