【问题标题】:How to add a column and row at the end of 2d array?如何在二维数组的末尾添加列和行?
【发布时间】:2019-05-01 13:29:18
【问题描述】:

每当调用该函数时,我想在二维数组的末尾添加一行和一列。

template <typename vertex> void directed_graph<vertex>::add_vertex(const vertex& u) 
{
    if (!directed_graph<vertex>::contains(u))
    {
        vertices.push_back(u);
        for (unsigned i = 0; i < vertices.size()-1; i ++)
            {
                adj_matrix[i].resize(vertices.size());
                adj_matrix[i][vertices.size()-1] = false;
            }

        adj_matrix.resize(vertices.size());
        for (unsigned i = 0; i < vertices.size(); i ++)
        {
            adj_matrix[vertices.size()-1][i] = false;
        }   
    }
}

我尝试了上面的代码,我收到的是 SegFault。

【问题讨论】:

    标签: c++ matrix multidimensional-array


    【解决方案1】:

    你想做什么

    您打算在vertices 向量中的初始push_back() 之后,将n*n 邻接矩阵扩展为(n+1)*(n+1),其中nvertices.size()-1

    这看起来(几乎)没问题:

    • 您的第一个 for-loop 会调整 n 现有内部向量的大小,添加事实上缺失的列。
    • 然后调整外部向量的大小,这会在末尾添加一个默认构造(空)向量。
    • 然后在第二个for-loop 中,您尝试通过直接为其元素赋值来初始化新的内部向量。

    这里有什么问题?

    不幸的是,当您执行最后一步时,最后一个内部向量仍然是空的。因此,您的第二个 for 循环使用了超出范围的下标 i,这会导致 UB(可能的症状:段错误)。

    如何解决?

    您需要做的就是在第二个循环之前调整最后一个内部向量的大小:

    ...
    adj_matrix.resize(vertices.size());
    adj_matrix[vertices.size()-1].resize(vertices.size());  //<<-- this is missing !
    for (unsigned i = 0; i < vertices.size(); i ++) 
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2021-04-24
      • 2010-12-22
      • 1970-01-01
      • 2020-10-14
      相关资源
      最近更新 更多