使用嵌套向量

Posted

技术标签:

【中文标题】使用嵌套向量【英文标题】:Working with nested vectors 【发布时间】:2016-07-08 16:37:27 【问题描述】:

我遇到了一些分段错误问题,我想我知道问题出在哪里,但我不确定如何解决它

我有一个这样的网格

    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 中初始化的网格。任何输入将不胜感激。谢谢你。

【问题讨论】:

您班级的(私人)成员是grid 还是theGrid?你想用theGrid[r].push_back(theGrid[r][c]);做什么? 它被称为theGrid。我想我试图将坐标 (r,c) 处的 Cell 附加到嵌套向量中,回头看,该代码实际上没有意义,因为我已经假设 theGrid[r][c] 存在跨度> 【参考方案1】:

init 函数中声明:

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

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

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

您可以设置向量的向量的大小(这本身就是一个坏主意,尝试使用一维向量并将其索引为 v(i * width + j) 而不是 v[i][j])在你的类的构造函数中或resize它在init中。

【讨论】:

【参考方案2】:

如果您在调用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);
        
    

【讨论】:

以上是关于使用嵌套向量的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套的 for 循环实现矩阵向量乘法的标量、行变体

嵌套向量中断控制器

初始化向量向量

在 C++ 中生成任意嵌套的向量

如何在 Clojure 中递归展平任意嵌套的向量和映射?

在C ++中生成任意嵌套的向量