2012-04-05 60 views
9

是否允许擦除迭代器指向的元素,并将同一迭代器前进一行以转到下一个元素?C++设置迭代器的删除

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

回答

5

是否允许删除被迭代器指向一个元素,推进相同的迭代器在一行赴下一个元素?

是的,它是有效的。


理由:

it++增量it使得它指的是下一个元素但产生其 原始值的副本。因此,当调用erase()时,it不引用被删除的元素。 而在std::set的情况下,只有擦除元素的迭代器才会失效。 #1

您可以将此代码示例作为样板代码来删除迭代器所引用的元素。


参考文献:

对于std::set
#1C++ 03标准23.1.2/8:

只有迭代器和引用到擦除元素无效

2

是的,它是有效的。表达式it++在函数被调用之前完全评估,因此该函数接收到前一个值it,但在被移除(并失效)时,迭代器已经增加。