2013-05-15 244 views
2

我想在C++中啓動一個3d矢量。我想它最初是一個100乘100,但我遇到了問題。 (我知道這基本上是2D,但我稍後會調整z軸向量大小。)初始化3d矢量C++

我有一個類Entity,該向量應該包含一個指針。我已經正確地包含了Entity矢量標題,但它仍然不起作用。以下是我正在嘗試執行的操作:

vector <vector <vector <Entity* > > > matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))); 

編譯器給出的錯誤是「數字常量之前的預期標識符」。我仔細檢查過,在這行之前沒有缺失分號或任何東西。如果我刪除這一行,代碼會乾淨地編譯。

這是直接在函數定義中的「private:」行之後。成員變量可以接受構造函數嗎?我也試圖把剛剛

vector <vector <vector <Entity* > > > matrix; 
在.h文件

,並

matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))); 
在.cpp文件中構造

,但沒有工作,要麼(敵不過電話和無效轉換從int到實體*)

什麼是申報的這個3D「矢量」(尤其是在班上最好的方法是什麼?)

謝謝!

+0

意識到由於單獨的分配,你將會得到糟糕的數據局部性。如果性能成爲問題,請考慮一個大向量並手動計算偏移量。另外,如果矢量「擁有」每個元素,則優先選擇'std :: unique_ptr'或'std :: shared_ptr'指向原始指針。 –

+0

使用2d向量數組有沒有任何內存問題? – Nathan

+0

這不是關於你使用多少內存,而是關於內存分配的地方。每個向量將分配它自己的內存堆,這意味着遍歷它們會讓你在內存中進行綁定(從而導致很多緩存未命中)。不過,首先確定它實際上是一個問題。 –

回答

2

你需要在你的類的構造函數中初始化它。

class MyClass 
{ 
public: 
    MyClass() 
     : matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))) 
    {} 

private: 
    vector <vector <vector <Entity* > > > matrix; 
}; 

就個人而言,我不會使用矩陣向量-的向量,正如我在下面的帖子已經討論:

Get the first column of a matrix represented by a vector of vectors

我會建議你採取類似的方法那是,但適合於3D矩陣。基本上你把前兩個維度看作一個矩形(在你的情況下是正方形),並且你將這些矩形堆疊起來以創建第三個維度。如果您想將第三維尺寸調整爲10個元素,則可以再添加9個100x100的塊。這將是一個單一的矢量調整大小操作。

如果您想要使用矢量矢量矢量進行上述調整大小,則需要執行10,000個矢量調整大小操作。你會將你的元素存儲擴展到整個堆中,並且由於緩存未命中而導致性能下降。

+0

即使在.cpp中定義了MyClass,它也能工作嗎? – Nathan

+0

我在這個例子中已經內聯了構造函數(* ie *定義和聲明位於同一個地方)。您可以像這樣在CPP文件中定義構造函數:'MyClass :: MyClass():matrix(...){}'。爲了簡潔起見,我使用了......。在這種情況下,類中的聲明就是:'MyClass();'。也許你應該找到關於C++的入門教程 – paddy