使用嵌套向量

时间:2016-07-08 16:37:27

标签: c++ vector segmentation-fault grid-layout

我在分段错误方面遇到了一些问题,我想我知道问题是什么,但我不确定如何修复它

我有一个网格

    class Grid {
      std::vector<std::vector<Cell>> grid;
      ...
    };

我有一堆使用该网格的成员函数。我的一个功能是初始化功能

    void Grid::init(int n) { 
      gridSize=n;
      vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));
      for(int r=0; r<n; ++r) {
        for(int c=0; c<n; ++c) {
          theGrid[r][n] = Cell();
          theGrid[r][n].setCoords(r,c);
          theGrid[r].push_back(theGrid[r][c]);
       }
     }

然而,一旦我初始化网格,我的印象是我可以在我的其他成员函数中调用theGrid [x] [y],只要我调用方法,我就会得到我在这里初始化的那个在同一个对象上。每当我尝试在其他成员函数中访问theGrid来处理它们的东西时,除非我包含

,否则会出现分段错误
       vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));

这基本上意味着我没有使用我想要的网格。我该如何解决这个问题?我希望能够在其他方法中使用我在init中初始化的网格。任何输入都将非常感激。谢谢。

2 个答案:

答案 0 :(得分:1)

init函数中声明:

vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));

我不知道n+1维度的原因,但事实上,您声明了一个名为theGrid本地变量,该变量可能具有或与您的类的私有成员名称不同(在发布的代码中称为grid),但其范围肯定仅限于init函数。 这就是为什么你必须在所有其他功能中重新声明它以避免分段错误的原因。

真正的修复应该是在所有成员函数中使用与类成员变量完全相同的名称,不用每次都重新声明它。

你可以设置矢量矢量的大小(这本身就是一个坏主意,尝试使用1D矢量并将其编入v(i * width + j)而不是v [i] [j])在您的班级的构造函数中,或init中的data.table

答案 1 :(得分:0)

如果您在调用init()后尝试确保向量的长度正确,则可以通过调用std::vector::resize()来实现此目的:

void Grid::init(int n)
{
    theGrid.resize(n);

    for(decltype(theGrid)::size_type rowIndex = 0; rowIndex < n; ++rowIndex))
    {
        auto& row = theGrid[rowIndex];
        row.resize(n);
        for(decltype(row)::size_type colIndex = 0; colIndex < n; ++colIndex)
        {
            auto& cell = row[colIndex];
            cell.setCoords(rowIndex, colIndex);
        }
    }
}