迭代集合时,需要根据条件删除某些元素具体标准。虽然假设删除元素会使迭代器无效似乎是合乎逻辑的,但这种行为是依赖于实现的。
标准 23.1.2.8 规定“插入成员不应影响迭代器和对迭代器的引用的有效性”容器,并且擦除成员应仅使迭代器和对已擦除元素的引用无效。”基于此,不能假设在迭代时删除元素总是会使迭代器无效。
一种方法是在删除元素后使用后缀增量运算符 it。这会将旧位置传递给擦除函数,同时将迭代器指向新位置:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { numbers.erase(it++); } else { ++it; } }
另一种方法涉及复制当前迭代器并稍后递增它:
while (it != numbers.end()) { // Copy the current iterator and increment it std::set<int>::iterator current = it++; int n = *current; if (n % 2 == 0) { // Don't invalidate iterator it, as it points to the next element numbers.erase(current); } }
C 11 通过擦除函数将迭代器返回到最后删除的元素之后的元素来简化此过程:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { it = numbers.erase(it); } else { ++it; } }
以上是如何在迭代时安全地从 `std::set` 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!