是否允许擦除迭代器指向的元素,并在一行中前进相同的迭代器以转到下一个元素?
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
是否允许擦除迭代器指向的元素,并在一行中前进相同的迭代器以转到下一个元素?
是的,它是有效的.
理由:
it++递增,it以便它引用下一个元素,但产生其原始值的副本.因此,it不引用erase()被调用时被删除的元素.并且std::set只有擦除元素的迭代器才会失效.#1
您可以将此代码示例视为样板代码,以删除迭代器所引用的元素.
参考文献:
对于std::set,
#1 C++ 03标准23.1.2/8:
只有迭代器和对已擦除元素的引用才会失效