2012-10-18 121 views
0

我正在研究物理引擎相关的项目。在下面的C++代码:作为另一个矢量数据类型的`struct`中的C++ :: vector矢量

#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; 
} 

是我分配的内存为world安全objects的方式吗?会有任何内存相关的问题?是否有更好的方式动态初始化objects(即不在构造函数中)?如果是这样,怎么样?谢谢。

+1

对我来说似乎完全没问题。当然有效率的问题:在其他向量中使用std :: vectors意味着你正在复制向量很多,在C++ 11中使用智能指针 – pm100

+1

可能更好一些,这些指针大多是非问题的 –

回答

2

我想象一下,使用RAII并让构造函数和析构函数object来照顾内存将是一个更好的方法。

添加一个新的object进入世界里,你可以使用由只调用push_back(),而不是需要创建具有i作为索引环路动态调整std::vector能力。为了避免不必要的调整,如果您知道预先添加了多少元素,则可以调用.reserve(n),其中n是您要添加的元素的数量。

+0

已经已经主要是RAII。不需要额外的处理。但将特定于维度的初始化移动到构造函数将完成作业是 –

+0

他已完成循环以保存扩展。但是你的建议加上'.reserve'会有同样的效果。六个之一...... –

+0

什么是'RAII'? – Rasoul

1

这是安全的。

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

您可能还能找到比嵌套向量水平更高效的方法。

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