1

前尺寸的局部定義我想定義的3維向量,其中頭兩個尺寸是固定的,但我想第三個要由動態填入函數在循環內調用。3維矢量 - 傳遞給功能

我不能完全肯定這是否是允許或沒有,但我試圖用類似反正實現:

#define NUM 6 

vector<vector<vector<double> > > foo; 

foo.resize(NUM); 
for(int j1=0; j1 < NUM; j1++){ 
    foo[j1].resize(NUM); 
} 

while(<condition>){ 
    fun(foo); 
} 

在這裏我聲明函數fun的

void fun(vector<vector<vector<double> > >& foo){ 
    for(int j1=0; j1<NUM; j1++){ 
     for(int j2=j1+1; j2<NUM; j2++){ 
      if(<condition>){ 
        foo[j1][j2].push_back(<value>); 
      } 
     } 
    } 
} 

我最初測試NUM等於5,一切看起來都很好,但是當我嘗試將其更改爲6時,我遇到了分段錯誤。

我已經看到,即使我沒有嘗試用push_back填充第三維(即我註釋了push_back行),但對foo作爲參數的函數的簡單調用會混淆FOO,那就是如果我插入

cout << foo.size() << endl; 
while循環

,我看到的第一次迭代後富的變化,尺寸從NUM改變到一個隨機數。

我還發現,這是平臺相關的,因爲我得到的Linux操作系統Ubuntu的錯誤,而不是MacOSX上。所以我想我正在做一些與內存分配有關的錯誤,但我不知道具體是什麼。有人可以向我解釋這一點嗎?

謝謝你的幫助!

+1

如果你註釋掉整個循環並試圖從'fun'執行'cout << foo.size()',會發生什麼?另外,您可以在調用函數中發佈'while()'中使用的確切條件嗎?並且已經從'5'改變NUM後重新編譯一切'6'(即一些代碼沒有使用'NUM'作爲'5'和一些其他的代碼使用'NUM'作爲編譯編譯'6'吧?) – Naveen

+1

你有問題存在的簡單獨立案例?你的代碼是(除了'fun'中的內循環 - 我認爲這是故意的)看起來沒問題。 – Nim

+1

此代碼應該在發佈時有效。您必須發佈SSCCE。 – Puppy

回答

0
foo.resize(NUM); 
for(int j1=0; j1 < NUM; j1++){ 
    foo[j1].resize(NUM); 
} 

這裏所調整foo[j1],但也只是在foo[j1]尚未..
所以foo[j1]只是一個垃圾呢。

+0

不應該這樣好嗎?我還可以怎樣聲明我已經知道的兩個維度? – Giulia

+3

不.. ..'foo.resize(NUM)'會創建一個'NUM'默認向量,所以'foo [j1]'是完全有效的。 – Naveen

+0

哎呀〜錯過了......應該沒那麼 – ravi

1

實際上就可以創建一個固定數量的大小與2D的3D矩陣還矩陣使用矢量構造函數作爲參數元素的數量,並且它會使用使填補副本的元件所需尺寸的在向量中。下面是它的樣子:

#include <iostream> 
#include <vector> 

int main() { 
    const size_t NUM = 6; 
    std::vector< std::vector< std::vector<double> > > Matr(NUM, std::vector< std::vector<double> >(NUM, std::vector<double>())); 
    std::cout << "num 2D matrices - " << Matr.size() << std::endl; 
    for(size_t j1 = 0; j1 < Matr.size(); ++j1){ 
     std::cout << "num rows - " << Matr[j1].size() << std::endl; 
     for(size_t j2 = 0; j2 < Matr[j1].size(); ++j2) { 
      Matr[j1][j2].push_back(0.09l); 
      std::cout << "num columns - " << Matr[j1][j2].size() << " "; 
     } 
     std::cout << std::endl; 
    } 
    return 0; 
}