如何在std :: set上进行迭代时删除元素 [英] How to remove elements from an std::set while iterating over it
本文介绍了如何在std :: set上进行迭代时删除元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在迭代过程中从 std :: set
中删除元素
How can I remove elements from an std::set
while iterating over it
我的第一次尝试是例如:
My first attempt looks like:
set<T> s;
for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
//Do some stuff
if(/*some condition*/)
s.erase(iter--);
}
但这是有问题的,如果我们要从集合中删除第一个元素,因为 iter-
使迭代器无效。
But this is problematic if we want to remove the first element from the set because iter--
invalidates the iterator.
执行此操作的标准方法是什么?
What's the standard way to do this?
推荐答案
标准方法是为
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
s.erase(iter++);
}
else
{
++iter;
}
}
在第一个条件下,我们确定 iter
仍然不会无效,因为 iter
的副本将被擦除,但是我们的在调用擦除之前,iter
已经增加。
By the first condition we are sure, that iter
will not be invalidated anyway, since a copy of iter
will be passed into erase, but our iter
is already incremented, before erase is called.
在C ++ 11中,代码类似于
In C++11, the code will be like
for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
if(/*some condition*/)
{
iter = s.erase(iter);
}
else
{
++iter;
}
}
这篇关于如何在std :: set上进行迭代时删除元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文