我不是最好的措辞,所以我将用一个例子来问我的问题。
例如,如果我正在制作一个FPS游戏,其中我使用向量来存储子弹(这将是它自己的类),因为我不知道我将在运行时处理多少个子弹,我将如何去访问向量的每个元素,以便每秒向每个子帧渲染每个子弹(假设我使用OpenGL作为渲染API,如果这有助于或产生任何差异)。
我希望这个问题很清楚。
答案 0 :(得分:4)
std::vector<Bullet> v;
void usebullet(const Bullet& b)
{
// use the members of b, such as b.x, b.y
}
矢量可以通过多种方式迭代:
for (size_t i=0; i<v.size(); ++i)
usebullet(v[i]); // or use v[i].x, v[i].y
for (std::vector<Bullet>::const_iterator it=v.begin(); it!=v.end(); ++it)
usebullet(*it); // or use it->x, it->y
的C ++ 0x:
for (auto& bullet: v)
usebullet(bullet); // or use bullet.x, bullet.y
反向迭代:
for (size_t i=v.size(); i>0; )
usebullet(v[--i]);
for (std::vector<Bullet>::const_reverse_iterator it=v.rbegin(); it!=v.rend(); ++it)
usebullet(*it);
有趣的是,基于的范围不会进行反向迭代。您可以使用多个适配器(包括例如boost::range::adaptors::reversed
)
答案 1 :(得分:3)
vector<Bullet> bullets;
vector<Bullet>::iterator bullet;
for ( bullet = bullets.begin(); bullet != bullets.end(); bullet++ )
draw_bullet(bullet->x, bullet->y, bullet->z);
(迭代器基本上是指向要迭代的元素的指针)
答案 2 :(得分:1)
如果std::vector<Bullet> v;
是你的向量,请说v[8]
以获得第9个元素。您可以迭代for (std::size_t i = 0, end = v.size(); i != end; ++i)
,但通常的方法是使用迭代器:
for (std::vector<Bullet>::iterator it = v.begin(), end = v.end(); it != end; ++it)
{
// now "*it" is your element
}
不要在循环内删除或插入元素!
答案 3 :(得分:0)
struct bullet
{
int x;
int y;
int z;
};
std::vector<bullet> bullets;
for(std::vector<bullet>::const_iterator it = bullets.begin(); it != bullets.end(); ++it)
draw_bullet(it->x, it->y, it->z);
答案 4 :(得分:0)
class Bullet {
public:
Bullet(int ID);
Draw() {
// implementation
}
// more implementation
};
制作一个矢量:
std::vector<Bullet> bullets;
向向量添加新项目符号:
bullets.push_back(Bullet(some_unique_ID_var));
遍历所有子弹:
for (size_t i = 0, size_t s = bullets.size(); i < s; i++) {
bullets[i].FollowTarget();
}
// or
for (std::vector<Bullet>::const_iterator it = bullets.begin(); it != bullets.end(); it++) {
it->Draw();
}
或者如果编译器支持c ++ 11:
for (auto it = bullets.begin(); it != bullets.end(); it++) {
it->Explode();
}
// or
for (Bullet& b: bullets) {
b.UpdatePosition();
}
仅用于完整性::))
#include <algorithm>
class ChangeSpeed {
void operator()(const Bullet& b)
{
// do something with b
}
} speed_change;
std::for_each(bullets.begin(), bullets.end(), speed_change);