是否允许擦除迭代器指向的元素,并将同一迭代器前进一行以转到下一个元素?C++设置迭代器的删除
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
是否允许擦除迭代器指向的元素,并将同一迭代器前进一行以转到下一个元素?C++设置迭代器的删除
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
是否允许删除被迭代器指向一个元素,推进相同的迭代器在一行赴下一个元素?
是的,它是有效的。
理由:
it++
增量it
使得它指的是下一个元素但产生其 原始值的副本。因此,当调用erase()
时,it
不引用被删除的元素。 而在std::set
的情况下,只有擦除元素的迭代器才会失效。 #1
您可以将此代码示例作为样板代码来删除迭代器所引用的元素。
参考文献:
对于std::set
,
#1C++ 03标准23.1.2/8:
只有迭代器和引用到擦除元素无效
是的,它是有效的。表达式it++
在函数被调用之前完全评估,因此该函数接收到前一个值it
,但在被移除(并失效)时,迭代器已经增加。