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的列表未排序。