关于类的向量

About vectors in regards to classes

本文关键字:向量 于类      更新时间:2023-10-16

我不擅长措辞,所以我将用一个例子来提问。

例如,如果我在制作一款FPS游戏,在游戏中我使用向量来存储子弹(这将是它自己的一个类(,因为我不知道在运行时要处理多少子弹,我该如何访问向量的每个元素,以便每隔那么多帧每秒将每个子弹渲染到屏幕上(假设我使用OpenGL作为渲染API,如果这有帮助或有任何不同的话(。

我希望这个问题足够清楚。

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(

vector<Bullet> bullets;
vector<Bullet>::iterator bullet;
for ( bullet = bullets.begin(); bullet != bullets.end(); bullet++ )
    draw_bullet(bullet->x, bullet->y, bullet->z);

(迭代器基本上是指向被迭代元素的指针(

如果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
}

不要从循环中擦除或插入元素到向量中!

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);
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);