2014-02-09 160 views
1

我有一個Polygon類。目前,多邊形的座標存儲在雙數組中,其中行數由「n」指定,列數僅爲3(x,y,z)。C++矢量類來存儲指向對象的指針

我想用stl向量改寫它(也就是向量中的每個元素都是指向大小爲3的float數組的指針)。這將如何完成?像這是一個有效的聲明?

vector<float*> vertices; 

在此先感謝!

回答

5
struct Vector3 { 

Vector3(float x, float y, float z):_x(x),_y(y),_z(z)) 
{ 
} 

float _x , _y , _z; 
}; 

std::vector<Vector3> vertices; 

無需指針,因爲這將增加管理的內存(如果它是由新的分配)的複雜性,因爲性病::向量將沒有自己的指針,你將不得不刪除它。

另外的std ::矢量保證是在內存中連續的,因此是安全的,採取的第一個元素的地址,

&vertices[0] 

而且你可以將它傳遞給一個API,比如OpenGL例如。

添加新元素也很容易,您可以創建構造函數或逐個設置元素。

示例構造:

vertices.push_back(Vector3(x, y, z)); 

這也是一個更好的做法是在開始一次分配你的記憶。

vertices.reserve(verticeCount); 
+2

如何添加元素可能不會立即明顯:vertices.push_back(的Vector3()); – TonyWilk

+0

使用指針不會導致管理內存。指針可以指向其生命週期已經被管理或者是自動的對象。儘管如此,除非你真的需要引用語義,否則使用值是一條路。 – juanchopanza

+0

@TonyWilk替代品?我很樂意將其添加到答案中。 – concept3d

0

用C++ 11你可以這樣做:

std::vector<std::tuple<float, float, float>> points; 

如果你沒有C++ 11,可以使用升壓得到的元組:

#include <boost/tuple/tuple.hpp> 

std::vector<boost::tuple<float, float, float> > points; 

或者你可以有一個結構來保存你的三個彩車:

struct Points 
{ 
    float x_; 
    float y_; 
    float z_; 
}; 

std::vector<Points> points; 

當你不需要它們時,遠離原始指針。依賴STL容器或定義自己的結構/類來保存事物會更安全。

0

是的。您還可以創建一個結構Point,存儲3D點,使它採用結構向量:

struct Point { 
    double x, y, z; 
} 

vector<Point> points; 

使用矢量,你通常會使用它。如果你喜歡,你也可以存儲指向矢量點的指針。

0

vector < vector <float> (3)> (n) ;這將做的工作