2015-11-01 49 views
2

我希望構建一個3D結構,它將由一個具有i = 1..N個網站的數組組成,在每個網站中都有一個2D矢量,該向量有一個有限的dim k = 1 ... L,並且在模擬過程中發生變化,從M = 0開始,使用push_back命令更新L元素。製作一個具有兩個固定長度和一個可以變化的3D矢量

我已經添加了一個解釋結構的圖,該如何寫這個東西,請注意,重要的是我可以通過索引來訪問這個結構,比如struct [i] [j] [k] 。

注意:這個結構存儲了N個實現的模擬數據,每個實現中有M個時間步長可以不同(在運行期間發生這種情況),並且在每個時間步中有一個L個點的點陣是更新。

enter image description here 我能做到它在2D情況下,但不是3D,我至今是:

array <vector <double>, N> Array; 
array <array <vector <double>, N>, L> Brray; 
for (int i=0; i<N; i++) 
{ 
    // calculate cal1 for 0'th index 
    Array[i].push_back(i) = cal1; 
    j=1; 
    while (j<M) 
    { 
     // calculate cal1 
     Array[i].push_back(Array[i][j-1]+cal1); 
     for (int k=0; k<L; j++) 
     { 
      // calculate cal2 
      Brray[i][j][k] = cal2; // this is the line I have a problem 
     } 
     //perform cal3 that decides whether there will be another iteration 
     if (cal3==1) 
     { 
      j++; 
     } 
    } 
} 
+0

困惑於爲什麼'struct [i] [j] [k]'很重要。 'struct(i,j,k)'不會一樣好嗎? 'struct [i] [j] [k]'允許有人做像'struct [i] [j] .clear();' – user4581301

+0

這樣的愚蠢東西'我認爲'Brray [i] [j] .push_back(cal2) '是你在做什麼。 – user4581301

+0

或者因爲你有L,'Brray [i] [j] .resize(L);'right'上面的(int k = 0; k user4581301

回答

1

你需要:

  • 含有
    • 含有
      • 含有常量位置L的陣列雙值
    • 可變大小爲M的向量固定大小N的陣列

您應該使用array<vector<array<double, L> >, N>。但是您需要在每個迭代中分配一個新的array<double, L>

您的代碼將成爲(僅Brray部分編輯):

array <vector <double>, N> Array; 
array <vector <array<double, L> >, N> Brray; // CHANGED 
for (int i=0; i<N; i++) 
{ 
    // calculate cal1 for 0'th index 
    Array[i].push_back(i) = cal1; 
    M = value; // value is different for every i 
    j=1; 
    while (j<M) 
    { 
     Brray[i].push_back(array<double, L>()); //ADDED: add a new array to vector 
     // calculate cal1 
     Array[i].push_back(Array[i][j-1]+cal1); 
     for (int k=0; k<L; j++) 
     { 
      // calculate cal2 
      Brray[i][j][k] = cal2; // this is the line I have a problem - should work now 
     } 
     j++; 
    } 
} 

我無法測試上面的代碼,但在C++ 11模式(鐺)這一個正常工作:

#include <iostream> 
#include <array> 
#include <vector> 


int main() { 
    constexpr int N=5, L=8; 
    std::array<std::vector<std::array<double, L> >, N> arr; 
    for (int i=0; i<N; i++) { 
     const int M = 2*i; 
     for (int j=0; j<M; j++) { 
      arr[i].push_back(std::array<double, L>()); 
      for (int k=0; k< L; k++) { 
       arr[i][j][k] = i+j+k; 
      } 
     } 
    } 

    for (int i=0; i<N; i++) { 
     const int M = 2*i; 
     std::cout << i << std::endl; 
     for (int j=0; j<M; j++) { 
      std::cout << "\t" << j << " :"; 
      for (int k=0; k< L; k++) { 
       std::cout << " " << arr[i][j][k]; 
      } 
      std::cout << std::endl; 
     } 
    } 

    return 0; 
} 
+0

這不起作用,它會產生一個錯誤:錯誤C2275:'std :: tr1 :: array <_Ty,_Size>':非法使用這種類型作爲表達式 – jarhead

+0

如果我能夠push_back整個L大小的矢量,完美的工作 – jarhead

+1

@jarhead:我已經添加了一個有效的代碼示例。順便說一句,我寫了'Brray [i] .push_back(array );'而不是'Brray [i] .push_back(array ());' - 它應該解釋錯誤... –

2

vector<vector<vector<double>>>,或者,由於兩個尺寸是編譯時間常數,array<vector<array<double, L>>, N>

編輯

要使用此,你會做沿着這些路線的東西:

array<vector<array<double, L>>, N> dat; 

此創建初始數組來保存所有的數據。在每次實現開始時,您已經有一個空向量來保存M個結果。你既可以使用

dat[i].resize(M); 

,如果你在你的循環開始知道M或

dat[i].emplace_back(); 

添加一個當您需要。然後這將給你你的陣列與L網站,你可以使用索引(dat[i][j][k])或迭代器填充它。

+0

我不知道每個循環中的M,它在循環中變化,取決於計算更多或更少的時間步驟可以添加,這就是爲什麼我想用push_back – jarhead

+0

更新它,以及什麼exacly是數組「結構」,我在那裏使用雙變量.... – jarhead

+1

@jarhead'double'然後。我現在很晚了。 – 1201ProgramAlarm

相關問題