2011-08-25 45 views
0

我有一個4d矢量,我正試圖給它添加值。我沒有收到任何編譯器錯誤,但是在運行它時,程序在到達向此向量添加值的行時凍結。訪問4d矢量的問題

我初始化在頭文件中的矢量是這樣的:

std::vector<std::vector<std::vector<std::vector<unsigned int> > > > _celllist; 

該陣列,然後用尺寸如下:

_celllist.resize(_vnx); 
for(int i=0;i<_vnx;i++) 
    { 
     //y axis size 
     _celllist[i].resize(_vny); 
      for(int j=0;j<_vny;j++) 
      { 
       //z axis size 
       _celllist[i][j].resize(_vnz); 
      } 
    } 

此行然後使程序崩潰:

_celllist[ix][iy][iz].push_back(i); 

請注意,ix,iy和iz都是int,我是一個無符號整數。

任何人都可以看到什麼可能會出錯嗎?謝謝

+0

ix iy iz和i的價值是什麼? –

+0

其他維度可能爲空,但您忽略分享該部分。你能包括一個完整的,最小的例子嗎? –

+0

@Gabe,_celllist不是指針,'_celllist = new ...'是非法的。 – john

回答

1

operator []不展開或保證元素有效。這是很少或沒有錯誤檢查的更快版本的at()

將代碼轉換到更安全的版本,現在:

_celllist.at(ix).at(iy).at(iz).push_back(i); 

這個新代碼將拋出一個out_of_range異常,如果你的指數是關閉。

+0

這是一個超出界限的錯誤,感謝這個版本,我會用它來幫助找出它爲什麼超出界限 – Kyle

+0

對,你也應該重新考慮是否std :: vector'對你的用例來說是正確的。 – Frunsi

1

你不能這樣做,因爲celllist [ix]不存在,因爲沒有任何東西被推回去。你是我在推回至第四嵌套向量當第4嵌套向量需要含有載作爲第二元素是第三個,等

更清楚

矢量> v ;

我不能這樣做:

v[0].push_back(1); 

直到我做的:

v.push_back(vector<int>()); 

但現在,我已經做了,

v[0] 

實際上是V的元素本身就是一個矢量。所以我可以訪問它,並推回回來,如:

v[0].push_back(7); 
+0

我認爲最近編輯添加的代碼,因爲代碼顯示所有的向量已經存在。 –

1

在猜測,我會說你做出你的數組越界訪問。當你做_celllist[ix][iy][iz].push_back(i)_celllist.size() > ix,是_celllist[ix].size() > iy,是_celllist[ix][iy].size() > iz?除非所有這些事情都是真的,否則你的程序將無法工作

+0

@Kyle:在崩潰的行之前加上'assert(ix <_celllist.size()&& iy <_celllist [ix] .size()&& iz <_celllist [ix] [iy] .size()你知道這就是問題 –

0

您看到的錯誤可能是由您的載體上的越界訪問引起的。請注意,std::vector::operator[]不檢查邊界!雖然std::vector::at()呢。

std::vector可能不是你想要的東西。當然,您可以像這樣使用嵌套的std::vector,但請記住,這不會像您想象的那樣創建4d矩陣。std::vector只是在連續的內存中管理一個動態數組。

也許你會對普通的C嵌套數組感到高興, unsigned int[XDIM][YDIM][ZDIM]