迭代时从 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中文网其他相关文章!