C++设置迭代器删除

Mar*_*son 9 c++ stl set

是否允许擦除迭代器指向的元素,并在一行中前进相同的迭代器以转到下一个元素?

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)

Alo*_*ave 5

是否允许擦除迭代器指向的元素,并在一行中前进相同的迭代器以转到下一个元素?

是的,它是有效的.


理由:

it++递增,it以便它引用下一个元素,但产生其原始值的副本.因此,it不引用erase()被调用时被删除的元素.并且std::set只有擦除元素的迭代器才会失效.#1

您可以将此代码示例视为样板代码,以删除迭代器所引用的元素.


参考文献:

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

只有迭代器和对已擦除元素的引用才会失效