[英]What is the std::vector::iterator's index in the vector?
我有一个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
的索引?
有一种更简单的方法来过滤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()
但仅保留第一个分区的顺序。
如果控制是否要删除元素的条件是:
object->isAlive()
然后,您应该使用STL方式进行删除,即擦除删除习惯用法:
bullets.erase(std::remove_if(bullets.begin(), bullets.end(),
[](Bullet const& b) {
return !b.isAlive();
}), bullets.end());
现在,要回答您的特定问题,可以像这样获得向量v
的迭代器的it
索引:
auto indx = std::distance(v.begin(), it);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.