【问题标题】:How to traverse vector from end to start? [duplicate]如何从头到尾遍历向量? [复制]
【发布时间】:2012-10-08 16:07:53
【问题描述】:

可能重复:
Erasing elements from a vector

我想删除一些元素,所以不想错过迭代

我现在遍历如下

vector<double> distances;
for(size_t i=0; i<distances.size();i++)
{

}

如何从头到尾遍历,以便安全地删除元素并访问我想要的元素?

【问题讨论】:

标签: c++ vector


【解决方案1】:
for (size_t i = distances.size() - 1; i >=0; --i)

但是,您应该改用std::remove_if

【讨论】:

    【解决方案2】:

    实际上,最好的办法就是作弊。

    在 C++ 中,我们使用擦除/删除习语来获得最高效率。你创建一个谓词然后你就开始了,现在使用 lambdas 变得非常简单。

    // This removes all odd elements in vec
    vec.erase(vec.remove_if([](int i) { return i % 2 == 1 }), vec.end();
    

    remove_if 的工作方式是将元素打乱(复制或移动)以收集您希望保留在容器头部的所有元素,尾部保留在未指定(但有效)中状态,然后返回给你一个指向尾部第一个元素的迭代器。

    然后使用容器的范围擦除方法,您要求容器一次性删除所有这些元素。

    【讨论】:

      【解决方案3】:

      使用reverse_iterator :

      vector<something>::reverse_iterator iter = v.rbegin();
      iter++; //Iterates backwards
      

      【讨论】:

      • 我不确定这是否可行,从向量中删除关联对象时迭代器可能会失效
      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2018-01-27
      • 2017-12-10
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      相关资源
      最近更新 更多