关于类的向量
About vectors in regards to classes
我不擅长措辞,所以我将用一个例子来提问。
例如,如果我在制作一款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);
相关文章:
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何从静态向量访问类元素?
- 在具有向量的类构造函数中进行析构函数调用
- 如何添加依赖于类本身的模板成员变量
- 为什么同时覆盖全局新运算符和特定于类的运算符不是模棱两可的行为?
- 依赖于类成员属性的类实例成员
- 如何在C++中传递向量作为类的引用?
- 查找 2D 向量的位置,该向量是类C++的一个元素
- C++ 使用向量进行类初始化
- C++ std::find() 寻址返回向量的类函数时的意外行为
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 为什么 std::vector 适用于类定义中的不完整类型?
- 如何在 c++ 中从字符串向量设置类对象
- 如何在不复制的情况下将向量向量从类函数传递到功能
- 如何让成员函数实现依赖于类的模板参数?
- 自定义类向量的类函数的分割错误
- 创建集合向量作为类成员会在 c++ 中给出错误
- 仅将方法应用于类的一个对象
- 我如何使用explicit模板实例化用于类定义中定义的模板成员函数
- 如何正确地将规则 5(或零?)应用于包含带有字符串的自定义对象向量的类