2016-03-22 65 views
-1

我有一些困難,聲明一個3D std ::向量的大小爲200乘200乘200。我可以看到關於設置大小的問題並用一個值初始化它,但都是針對一維矢量的。初始化3D std ::向量的大小和值

我試圖啓動與類似

vector<vector<vector<uchar>>> vsfl(200,200,200,1); 

但有編譯錯誤。

我最初開始UCHAR vsfl [200] [200] [200],但導致堆棧溢出錯誤

謝謝你啊!

+0

回到你開始在那裏,但移動功能外發表聲明,你不會得到一個堆棧溢出錯誤 – zeromus

+0

@zeromus:我嘗試了你所說的,但以相反的方式,從類的屬性到函數內的變量,並且沒有堆棧溢出錯誤。謝謝!順便說一下,嵌套矢量是一個不好的選擇? –

+1

這可能是一個好的或壞的選擇,它取決於你在做什麼。對於大多數情況下,矢量將比簡單的數組慢得多和臃腫。 在一個函數中擁有這麼大的數組可能會在稍後以不同的方式再次咬你,注意一下。底線是,你需要以某種方式將它從堆棧中拿出來(或者使用懷疑的向量,這會有效地調用一堆新的[],以避免它被堆棧) – zeromus

回答

1

這是同樣的事情作爲一維向量,但你必須要改變參數位:

vector<vector<vector<int>>> vsfl(200, vector<vector<int>>(200, vector<int>(200, 1))); 

因爲std::vector構造函數採用T作爲第二個參數,這是一個三維矢量,所以你必須如果你想初始化它,請調用T的構造函數。

+0

看起來非常混亂,但它可以工作。謝謝! –

0

回到你開始的位置,但是把聲明移到函數外面,你不會得到堆棧溢出錯誤。這對堆棧來說太多了。

如果您正在編寫的代碼位於方法中,那麼將它移動到函數外部會導致對象變大 - 如果您在函數內聲明該對象,則會遇到同樣的問題。此時,您可以將對象聲明移到該函數之外,也可以將其移除。

另一種選擇,如果你需要它,會是這樣:

struct BigArray { int elems[200][200][200]; }; 
//be sure to delete me! 
BigArray *test = new BigArray; 
-1

首先,選擇要使用的容器。如果的大小每隔容器在編譯時就已知,比如你的情況似乎是這樣,並且它永遠不會改變,那麼使用普通的舊數組。

否則,你想要一個向量。在算法上,你想要的是用200個矢量對200個矢量進行初始化,並用200個uchar進行初始化,無論uchar是什麼。

所以,爲了做到這一點,你可以使用...

template<typename T> 
using unidimensional_vector = std::vector<T>; 

template<typename T> 
using bidimensional_vector = std::vector<unidimensional_vector<T>>; 

template<typename T> 
using tridimensional_vector = std::vector<bidimensional_vector<T>>; 

tridimensional_vector<uchar> my_vector(200, bidimensional_vector<uchar>(200, unidimensional_vector<uchar>()));