首页 >后端开发 >C++ >在迭代时从 `std::set` 中删除元素是否安全以及如何正确执行?

在迭代时从 `std::set` 中删除元素是否安全以及如何正确执行?

DDD
DDD原创
2024-12-11 09:47:18490浏览

Is Erasing Elements from a `std::set` While Iterating Safe and How to Do It Correctly?

迭代时从 std::set 中删除元素:安全吗?

迭代集合并删除满足特定条件的元素是C 编程中的常见任务。但是,迭代时擦除元素的行为可能会引起对迭代器无效的担忧。

在提供的代码片段中,您迭代一组整数并擦除偶数。虽然此代码似乎有效,但它依赖于特定于实现的行为。 C 标准没有明确指定在迭代集合时从集合中删除元素时会发生什么。

标准一致方法

为了确保可移植性和可靠性,请考虑使用标准的一致方法:

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

此方法使用后缀增量运算符 it ,它通过要擦除的旧迭代器,但在返回之前将其前进以指向下一个元素。结果,循环正确迭代,并且迭代器在每次擦除操作后仍然有效。

C 11 解决方案

C 11 为 set 引入了更新的擦除方法简化了迭代时擦除元素的过程:

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

这种方法使用了擦除方法,该方法返回一个指向被擦除元素后面的元素的迭代器(如果最后一个元素被擦除,则返回 set::end)。这通过消除使用后缀增量的需要并确保它在每次擦除操作后保持有效来简化循环。

结论

虽然初始代码片段可以在对于某些实现,通常不建议依赖于特定于实现的行为。通过使用标准的一致性方法或 C 11 擦除方法,您可以确保您的代码在不同的编译器和平台上正确且可移植地工作。

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

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