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