Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代时从stl列表中删除多个元素_C++_List_Stl_Erase_Removeall - Fatal编程技术网

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

C++ 迭代时从stl列表中删除多个元素,c++,list,stl,erase,removeall,C++,List,Stl,Erase,Removeall,这与我们的情况不同。我的情况不同 假设我有一个这样的列表 1 2 3 1 2 2 1 3 我想以这样的方式迭代这个stl列表 当我第一次遇到一个元素X时,我会做一些活动,然后我需要删除该列表中的所有元素X并继续迭代。在C++中,这是一个有效的方法。p> 我担心当我执行删除或擦除操作时,会使迭代器失效。如果它只是一个元素,那么我可以潜在地增加迭代器,然后删除。但在我的场景中,我需要删除/删除所有发生的事件 我是这么想的 while (!list.empty()) { int

这与我们的情况不同。我的情况不同

假设我有一个这样的列表

1  2  3  1  2  2  1  3
我想以这样的方式迭代这个stl列表 当我第一次遇到一个元素X时,我会做一些活动,然后我需要删除该列表中的所有元素X并继续迭代。在C++中,这是一个有效的方法。p> 我担心当我执行删除或擦除操作时,会使迭代器失效。如果它只是一个元素,那么我可以潜在地增加迭代器,然后删除。但在我的场景中,我需要删除/删除所有发生的事件

我是这么想的

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

不知道这是否是最好的。

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

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;
list old_list={1,2,3,1,2,2,1,3};
列出新的清单;
设置元素;
用于(int el:旧列表){
if(seed_elements.find(el)=seed_elements.end()){
SEED_元素。插入(el);
新列表。推回(el);
}
}
返回新的_列表;

这将只处理每个值一次,
新列表
将只包含
旧列表
中每个元素的第一个副本。这在O(n*log(n))中运行,因为每个迭代都执行一个集合查找(您可以通过使用hashset来实现这个O(n))。这比您的方法所使用的O(n^2)要好得多。

@dwcanillas这会使未知的迭代器集无效。@p抱歉,我以为我们讨论的是向量,而不是列表。在迭代时必须删除,还是在迭代之前可以修改列表?在后一种情况下,您可以使用
list::unique
仅保留基本上您需要的唯一元素。是的,我需要从列表的前面执行活动。(它类似于队列)。来自list::unique documentation:“注意,只有当元素与紧靠它前面的元素进行比较时,才会从列表容器中删除该元素。因此,此函数对于排序列表特别有用。”OP的列表未排序。