我有一个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,i是unsigned int。
谁能看到这里可能出现的问题?感谢
答案 0 :(得分:1)
你不能这样做,因为celllist [ix]不存在,因为没有任何东西被推回去。当第4个嵌套向量必须作为第3个包含的元素包含在第2个嵌套向量中时,你将向后推进到第4个嵌套向量。
更明确
vector&gt; V;
我做不到:
v[0].push_back(1);
直到我:
v.push_back(vector<int>());
但是现在我已经这样做了,
v[0]
实际上是v的一个元素,它是一个向量本身。所以我可以访问它并按照以下方式推回:
v[0].push_back(7);
答案 1 :(得分:1)
猜测我会说你对数组进行了超出范围的访问。当您_celllist[ix][iy][iz].push_back(i)
_celllist.size() > ix
时,_celllist[ix].size() > iy
是_celllist[ix][iy].size() > iz
吗?除非所有这些都是真的,否则你的程序将无效。
答案 2 :(得分:1)
operator []不会扩展或保证元素有效。它是at()的更快版本,几乎没有错误检查:
现在将您的代码转换为更安全的版本:
_celllist.at(ix).at(iy).at(iz).push_back(i);
如果您的索引已关闭,此新代码将抛出out_of_range异常。
答案 3 :(得分:0)
您看到的错误可能是由您的向量的超出范围访问引起的。注意,std::vector::operator[]
不检查边界!虽然std::vector::at()
可以。
std::vector
可能不是你想要的东西。当然你可以像这样使用嵌套的std::vector
,但请记住,这不会像你想象的那样创建4d矩阵。 std::vector
只管理连续内存中的动态数组。
也许你会对普通的C嵌套数组更开心,例如unsigned int[XDIM][YDIM][ZDIM]
。