9

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

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

2 回答 2

5

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

是的,它是有效的。


理由:

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

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


参考:

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

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

于 2012-04-05T18:03:45.097 回答
2

是的,它是有效的。表达式it++在调用函数之前被完全评估,因此函数接收 的先前值it,但在被删除(和无效)时,迭代器已经递增。

于 2012-04-05T18:04:00.237 回答