2011-08-25 46 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]