C ++向量的向量,无法编辑

时间:2012-11-16 02:20:23

标签: c++ vector

我有一个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大于我的向量的大小。我假设这是一个零大小的矩阵,但我不知道为什么我不能让它更大。有什么建议?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

这也可以做到。它是更干净的代码,但由于它产生了一个额外的矢量对象,因此效率稍低。

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.0 s的临界向量初始化外部向量

答案 1 :(得分:2)

您需要使用数据M.resize(num_nodes)

填充矢量M.

这应该这样做:

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
}