访问4d向量的问题

时间:2011-08-25 22:06:35

标签: c++ vector

我有一个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。

谁能看到这里可能出现的问题?感谢

4 个答案:

答案 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]