关于课程的向量

时间:2011-11-23 14:04:56

标签: c++ stl

我不是最好的措辞,所以我将用一个例子来问我的问题。

例如,如果我正在制作一个FPS游戏,其中我使用向量来存储子弹(这将是它自己的类),因为我不知道我将在运行时处理多少个子弹,我将如何去访问向量的每个元素,以便每秒向每个子帧渲染每个子弹(假设我使用OpenGL作为渲染API,如果这有助于或产生任何差异)。

我希望这个问题很清楚。

5 个答案:

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