2012-10-18 5 views
0

저는 물리 엔진 관련 프로젝트를 진행하고 있습니다. 아래의 C++ 코드에서 :C++ : 다른 벡터의 데이터 유형으로 struct의 벡터 벡터

#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의 생성자와 소멸자를 사용하는 것이 더 나은 방법이라고 생각합니다.

그냥 push_back()를 호출하는 대신 인덱스로 i을 가지고 루프를 만들 필요가 동적으로 크기를 조정하는 std::vector 기능을 사용할 수있다 세계에 새로운 object에 추가. 미리 추가 할 요소의 수를 알면 불필요한 크기 조정을 피하기 위해 .reserve(n)을 호출 할 수 있습니다. 여기서 n은 추가 할 요소의 수입니다.

+0

이미 주로 RAII. 소멸자에서 추가 처리가 필요하지 않습니다. 그러나 차원 별 초기화를 생성자로 이동하면 작업이 완료됩니다. –

+0

확장을 저장하기 위해 루프가 완료되었습니다. 그러나 당신의 제안과'.reserve'는 같은 효과가 있습니다. 6 명 중 하나 ... –

+0

'RAII '란 무엇입니까? – Rasoul

1

안전합니다.

적절한 경우 작성자를 작성자로 모두 이동하여 상용구를 절약 할 수 있습니다.

중첩 된 벡터의 레벨보다 효율적인 방법을 찾을 수도 있습니다.

따라서 안전하지만 여전히 개선 될 수 있습니다.