访问4d向量的问题

Problem accessing 4d vector

本文关键字:问题 向量 4d 访问      更新时间:2023-10-16

我有一个4d矢量,我正试图为它添加值。我没有收到任何编译器错误,但是当运行它时,当它到达我向这个向量添加值的那一行时,程序冻结了。

我在头文件中像这样初始化vector:

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是无符号int型。

有人能看出这里可能出了什么问题吗?由于

操作符[]不展开或保证元素是有效的。它是at()的更快版本,很少或没有错误检查:

暂时将代码转换为更安全的版本:

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

这个新代码将抛出一个out_of_range异常,如果你的索引是关闭的。

我猜你在做越界访问你的数组。当你做_celllist[ix][iy][iz].push_back(i)时,是_celllist.size() > ix,是_celllist[ix].size() > iy,是_celllist[ix][iy].size() > iz ?

你不能这样做,因为celllist[ix]不存在,因为没有任何东西被推回它。你把i推到第四个嵌套向量,而第四个嵌套向量必须作为元素包含在第三个元素中,作为元素包含在第二个元素中,等等。

更清楚地

vector>v;

I can't do:

v[0].push_back(1);

直到我做:

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

但是现在我已经这么做了,

v[0]

实际上是v的一个元素,它本身也是一个向量。因此,我可以访问它并执行push操作,比如:

v[0].push_back(7);

您看到的错误可能是由于对vector的越界访问引起的。注意,std::vector::operator[]不检查边界!虽然std::vector::at()有。

std::vector可能不是你想要的东西。当然,您可以像这样使用嵌套的std::vector,但请记住,这不会像您想象的那样创建4d矩阵。std::vector只管理连续内存中的动态数组。

也许你会更喜欢普通的C嵌套数组,例如unsigned int[XDIM][YDIM][ZDIM] .