C ++ ::`struct`中的向量向量作为另一个向量的数据类型

时间:2012-10-18 21:54:47

标签: c++ stdvector

我正在研究与物理引擎相关的项目。在下面的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(即不在构造函数中)?如果是这样,怎么样?感谢。

2 个答案:

答案 0 :(得分:2)

我认为使用RAII并使用object的构造函数和析构函数来处理内存将是一种更好的方法。

在新的object添加到世界中,您可以通过调用std::vector而不需要创建具有push_back()的循环来使用i动态调整大小的功能作为指数。如果您知道提前添加了多少元素,为了避免不必要的调整大小,您可以致电.reserve(n),其中n是您要添加的元素数量。

答案 1 :(得分:1)

这很安全。

如果合适,您可以通过将所有填充移动到构造函数中来保存样板。

您也可以找到比嵌套向量级别更有效的方法。

所以,它是安全的,但仍然可以改进。