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

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

Patricia Arquette
Patricia Arquette原创
2024-12-11 04:08:09795浏览

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

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

迭代集合并遇到需要根据特定条件删除的元素时,考虑对迭代器的影响至关重要。迭代时删除元素可能会使迭代器无效,从而导致未定义的行为。

一个常见的误解是,在迭代时从集合中删除元素会使迭代器无效并导致 for 循环中的增量有未定义的行为。然而,情况并非一定如此。元素删除期间迭代器的行为取决于实现,并且根据 C 标准未定义。

迭代时从集合中安全删除元素的一种方法是使用替代循环结构:

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

在此代码中,迭代器按值传递给擦除操作,该操作返回一个指向下一个元素的迭代器(或者如果最后一个元素是集合的末尾)已删除)。这种方法符合 C 标准,并确保迭代器保持有效。

另一个选项,虽然稍微详细一些,是在擦除元素之前创建当前迭代器的副本:

for (auto it = numbers.begin(); it != numbers.end(); ) {
    std::set<int>::iterator current = it++;
    if (*current % 2 == 0) {
        numbers.erase(current);
    }
}

该解决方案将迭代器增量与可能的擦除操作分开,确保指向下一个元素的迭代器仍然存在有效。

需要注意的是,除非专门针对特定容器实现,否则擦除操作通常会使集合中的所有迭代器无效,甚至超出被删除的元素。

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

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