【问题标题】:About vectors in regards to classes关于关于类的向量
【发布时间】:2011-11-23 14:04:56
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 std::for_each 还是常规的 for 循环?

标签: c++ stl


【解决方案1】:
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);

有趣的是,range based for 不做反向迭代。您可以使用许多适配器(包括例如boost::range::adaptors::reversed

【讨论】:

  • 装饰有会员使用情况,以防 OP 想查看更多细节 :)
  • 在相反的情况下,我认为您遇到了迭代器问题,reverse 迭代器是它们自己的一种类型。
  • @MatthieuM.:当然,我掩盖了它(思考 - 闪电式 - 哦,有一个标准转换)。当然,这还不够,谢谢,修复
【解决方案2】:
vector<Bullet> bullets;
vector<Bullet>::iterator bullet;
for ( bullet = bullets.begin(); bullet != bullets.end(); bullet++ )
    draw_bullet(bullet->x, bullet->y, bullet->z);

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

【讨论】:

  • 也许我的问题措辞不佳,我知道如何使用迭代器来访问每个元素,但是假设 x y 和 z 是子弹类中的公共整数,我将如何访问其中的每一个如果它们包含在向量中,则单独的属性?
【解决方案3】:

如果std::vector&lt;Bullet&gt; 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
}

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

【讨论】:

    【解决方案4】:
    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);
    

    【讨论】:

      【解决方案5】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2013-05-05
        • 2011-09-26
        相关资源
        最近更新 更多