向量中的std :: vector :: iterator索引是什么?

时间:2014-07-10 17:45:00

标签: c++ vector iterator swap

我有一个std::vector<Bullet> bullets,在下面的for循环中,如果它不再存在,我想从矢量中移除一颗子弹。

我的计划是删除pop_back()元素。如果向量中有多个元素,我想首先用向量中的最后一个元素交换要删除的元素,然后调用pop_back()

for (std::vector<Bullet>::iterator b = bullets.begin(); b != bullets.end(); ++b) {
  if(!b->isAlive()) {
    if (bullets.size() > 1) {
      std::iter_swap(bullets + ..., bullets.end());
    }
    bullets.pop_back();
  }
}

问题是iter_swap中的第一个参数。我查了http://www.cplusplus.com/reference/algorithm/iter_swap/,第一个参数的语法是向量+元素的位置。

如何在向量中找到b的索引?

2 个答案:

答案 0 :(得分:3)

有一种更简单的方法来过滤std::vector

#include <algorithm>

auto part = std::remove_if(
    bullets_.begin(),
    bullets_.end(),
    [](const Bullet &bullet) { return !bullet.isAlive(); });
bullets_.erase(part, bullets_.end());

这会将矢量划分为活的子弹和死子弹,然后删除带有死子弹的线段。

std::remove_if()函数与partition()类似,但只保留第一个分区的顺序。

答案 1 :(得分:3)

如果控制元素是否被删除的条件是:

object->isAlive()

然后你应该使用STL方式进行删除,即删除删除习语:

bullets.erase(std::remove_if(bullets.begin(), bullets.end(), 
[](Bullet const& b) {
   return !b.isAlive(); 
}), bullets.end());

现在,为了回答您的特定问题,可以像这样获取向量it中的迭代器v索引:

auto indx = std::distance(v.begin(), it);