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