我有一个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
的索引?
答案 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);