【问题标题】:C++ set iterator removalC++ 集合迭代器移除
【发布时间】:2026-02-02 08:25:01
【问题描述】:

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

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

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

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

    是的,它是有效的。


    理由:

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

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


    参考资料:

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

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

    【讨论】:

      【解决方案2】:

      是的,它是有效的。表达式it++ 在函数被调用之前被完全计算,所以函数接收到it 的前一个值,但是当它被移除(并失效)时,迭代器已经递增了。

      【讨论】: