这与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);
}
不知道这是否是最好的。
答案 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)。