【问题标题】:C++ Vector of vectors, cannot edit向量的 C++ 向量,无法编辑
【发布时间】:2012-11-16 02:20:22
【问题描述】:

我有一个 MatrixGraph 类,其成员变量 M 的类型为 vector<vector<double> >。我有一个接受无符号的构造函数,并从该输入生成一个 NxN 矩阵,我想将它初始化为零。问题是当我运行我的代码时,调试器会在我尝试分配东西时启动。我试过方法,第一种:

MatrixGraph::MatrixGraph(unsigned num_nodes) {
for(int i = 0;i < num_nodes;i++) {
    for(int j = 0;j < num_nodes;j++) {
        M[i][j] = 0.0;//breaks on this line
    }//end i for loop
}//end j for loop
}

我尝试过的第二种方法是在这里找到的,但也没有用:

MatrixGraph::MatrixGraph(unsigned num_nodes) {
for(int i = 0;i < num_nodes;i++) {
        M[i].resize(num_nodes);//breaks on this line
    }
}

我在这里评论了调用堆栈的最后一行在我得到错误之前的位置。调用堆栈上的下一行显示了类向量,并说我的 Pos 大于我的向量的大小。我假设这是一个大小为零的矩阵,但我不知道为什么我不能让它更大。有什么建议么?

谢谢!

【问题讨论】:

  • 为什么 'i' 和 'j' 也不是无符号的,因为 'num_nodes' 是无符号的?最好还是使用 size_t

标签: c++ vector


【解决方案1】:

您的代码失败的原因是您不能在矢量在该元素存在之前对矢量使用 [] 操作。向向量添加值的常用方法是使用 push_back

如果要初始化为 0,则需要 assign()。将外部向量调整为所需大小,然后为每个内部向量分配 0

M.resize(num_nodes);
for(int i = 0;i < num_nodes;i++) 
{        
    M[i].assign(num_nodes,0.0f);
}//end i for loop

这也是可以的。它的代码更简洁,但效率稍低,因为它会产生 1 个额外的矢量对象。

vector<double> temp;
temp.assign(num_nodes,0.0);
M.assign(num_nodes,temp);

或者只是

M.assign(num_nodes,vector<double>(num_nodes,0.0));

最整洁的(礼貌@Mike Seymour)将是

MatrixGraph(unsigned num_nodes) 
   : M(num_nodes, vector<double>(num_nodes,0.0)) 
{}

(感谢 Mike Seymour 的构造函数语法)

你在这里做的是用一个充满0.0s的临时向量初始化外部向量

【讨论】:

    【解决方案2】:

    您需要用数据填充向量 M:M.resize(num_nodes)

    应该这样做:

    MatrixGraph::MatrixGraph(unsigned num_nodes) 
    {
        M.resize(num_nodes);
        for(int i = 0;i < num_nodes;i++) 
        {
            M[i].resize(num_nodes);
            for(int j = 0;j < num_nodes;j++) 
            {
                M[i][j] = 0.0;
            }//end j for loop
        }//end i for loop
    }
    

    【讨论】:

    • 或者,如果您没有按代码行获得报酬,MatrixGraph(unsigned n) : M(n, vector&lt;double&gt;(n)) {}
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2021-09-22
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多