繁体   English   中英

C++ 设置迭代器移除

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM