首页 >后端开发 >C++ >如何在迭代时安全地从 `std::set` 中删除元素?

如何在迭代时安全地从 `std::set` 中删除元素?

Linda Hamilton
Linda Hamilton原创
2024-12-28 13:21:10939浏览

How to Safely Delete Elements from a `std::set` While Iterating?

迭代时从 std::set 中删除元素

迭代集合时,需要根据条件删除某些元素具体标准。虽然假设删除元素会使迭代器无效似乎是合乎逻辑的,但这种行为是依赖于实现的。

标准 23.1.2.8 规定“插入成员不应影响迭代器和对迭代器的引用的有效性”容器,并且擦除成员应仅使迭代器和对已擦除元素的引用无效。”基于此,不能假设在迭代时删除元素总是会使迭代器无效。

一种方法是在删除元素后使用后缀增量运算符 it。这会将旧位置传递给擦除函数,同时将迭代器指向新位置:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        numbers.erase(it++);
    }
    else {
        ++it;
    }
}

另一种方法涉及复制当前迭代器并稍后递增它:

while (it != numbers.end()) {
    // Copy the current iterator and increment it
    std::set<int>::iterator current = it++;
    int n = *current;
    if (n % 2 == 0) {
        // Don't invalidate iterator it, as it points to the next element
        numbers.erase(current);
    }
}

C 11 通过擦除函数将迭代器返回到最后删除的元素之后的元素来简化此过程:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}

以上是如何在迭代时安全地从 `std::set` 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn