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

在 C 11 中迭代时如何安全地从向量中删除元素?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-28 20:56:11311浏览

How to Safely Remove Elements from a Vector While Iterating in C  11?

在 C 11 基于范围的循环期间从向量中删除元素

C 11 中基于范围的 for 循环提供了一种便捷的迭代方式容器的元素,特别是当您需要对每个元素执行操作时。但是,在处理向量时,有时可能需要在迭代向量时从向量中删除元素。

问题

考虑以下代码:

std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());

for (IInventory* index : inv)
{
    // Do some stuff
    // ...
}

在循环内,您意识到需要从向量 inv 中删除特定元素。但是,您遇到两个问题:

  1. 无法删除元素:基于范围的 for 循环不提供在迭代向量时修改向量的方法。
  2. 循环有效性:从向量中删除元素可能会使向量无效

解决方案

基于范围的 for 循环适用于仅需要访问容器的每个元素一次的情况。如果需要在迭代期间修改或删除元素,则应使用传统的 for 循环或其基于迭代器的变体之一。

以下是如何使用具有迭代器增量管理的传统 for 循环修改代码:

for (auto i = inv.begin(); i != inv.end(); /*++i*/) {
    // Do stuff
    if (should_remove) {
        i = inv.erase(i);
    } else {
        ++i;
    }
}

通过显式管理迭代器增量,您可以维护循环的有效性,并确保您可以删除和修改元素而不会遇到任何错误。

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

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