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

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

Patricia Arquette
Patricia Arquette原创
2024-12-13 06:38:14765浏览

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

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

在 C 中,std::set 容器提供高效的存储和检索的独特元素。修改集合时,可能会出现需要迭代其元素并删除满足特定条件的元素的情况。了解迭代期间删除元素的细微差别对于避免潜在陷阱至关重要。

您提供的示例代码演示了通过使用 std::set::iterator 进行迭代来尝试从集合中删除偶数。然而,循环内擦除的方法引发了关于迭代器有效性的问题。

C 标准(第 23.1.2.8 节)指定任何修改操作(包括擦除)仅使迭代器和对已擦除元素的引用无效。但是,它不保证迭代器指向容器中的其他元素。

在给定代码的上下文中,以下实现遵循标准并确保迭代器的有效性:

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

这个修改后的循环利用“后缀增量”(it),它在前进到下一个之前将迭代器返回到旧位置。因此,可以安全地删除刚刚访问的元素,同时维护后续迭代的迭代器。

随着 C 11 的出现,erase 成员函数将迭代器返回到后续元素(或 std::set::如果最后一个元素被删除则结束)。此更新提供了更简洁和优雅的解决方案:

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

总而言之,虽然在迭代期间从集合中删除元素可能看起来很直观,但需要清楚地了解迭代器行为和标准规范,以避免潜在的陷阱。这里讨论的实现符合 C 标准,并确保可预测且高效地从集合中删除元素。

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

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