0

私は物理エンジン関連のプロジェクトに取り組んでいます。以下のC++コードでは:

#include <iostream>
#include <vector>

struct Vector3
{
  float x;
  float y;
  float z;
};

struct object
{
  std::vector < std::vector < Vector3 > > set_vertices;
  int ID;
  int Type;
};

class World
{
  public:
    std::vector< object > objects;

  private:
    // other members
};

int main (void)
{
  World world;

  // How to fill in "objects" of "world"?
  //   Is this safe to do?
  world.objects.resize(5);
  //   What about the way of allocating "set_vertices" below?
  for(size_t i=0; i<world.objects.size(); i++)
  {
    world.objects[i].set_vertices.resize(12, std::vector < Vector3 >(3));
    for(size_t j=0; j<world.objects[i].set_vertices.size(); j++)
    {
      for(size_t k=0; k<world.objects[i].set_vertices[j].size(); k++)
      {
        world.objects[i].set_vertices[j][k].x = 0.0f;
        world.objects[i].set_vertices[j][k].y = 0.0f;
        world.objects[i].set_vertices[j][k].z = 0.0f;
        world.objects[i].ID = i;
        world.objects[i].Type = 0;
      }
    }
  }

  return 0;
}

安全のためobjectsにメモリを割り当てた方法はありますか?worldメモリ関連の問題はありますか?objects動的に初期化する(つまり、コンストラクターではない)より良い方法はありますか?もしそうなら、どのように?ありがとう。

4

2 に答える 2

2

RAIIを使用し、コンストラクタとデストラクタを使用しobjectてメモリを処理する方が、これを行うためのより良い方法になると思います。

object新しい世界に追加すると、インデックスとして持つループを作成する代わりに、std::vector呼び出すだけで動的にサイズ変更する機能を利用できます。追加する要素の数が事前にわかっている場合に不要なサイズ変更を回避するために、追加する要素の数はどこにあるかを呼び出すことができます。push_back()i.reserve(n)n

于 2012-10-18T21:57:19.583 に答える
1

安全です。

必要に応じて、すべての入力をコンストラクターに移動することで、定型文を節約できます。

また、ネストされたベクトルのレベルよりも効率的なアプローチを見つけることができる場合があります。

したがって、安全ですが、それでも改善される可能性があります。

于 2012-10-18T22:00:19.193 に答える