[英]C++ set iterator removal
是否允许擦除迭代器指向的元素,并将同一个迭代器一行推进到 go 到下一个元素?
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}
是否允许擦除迭代器指向的元素,并将同一个迭代器一行推进到 go 到下一个元素?
是的,它是有效的。
理由:
it++
递增it
以便它引用下一个元素但产生其原始值的副本。 因此, it
不引用调用erase()
时删除的元素。 在std::set
的情况下,只有被擦除元素的迭代器是无效的。 #1
您可以将此代码示例视为样板代码,用于删除迭代器所引用的元素。
参考:
对于std::set
,
#1 C++03 标准 23.1.2/8:
只有对已擦除元素的迭代器和引用无效
是的,这是有效的。 表达式it++
在 function 被调用之前被完全求值,因此 function 接收到it
的先前值,但是在它被移除(和失效)之前,迭代器已经递增了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.