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

3

我有一个MatrixGraph类,其中一个成员变量M的类型为vector<vector<double> >。我有一个构造函数,它接受一个unsigned参数,并从该输入创建一个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。 - Chubsdad
2个回答

3
你的代码出现错误是因为在向量中元素不存在之前,无法使用[]操作符。向向量中添加值的通常方法是使用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

这也可以实现。这是更清晰的代码,但效率略低,因为它会产生一个额外的向量对象。
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的临时向量来初始化外部向量


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
}

1
或者,如果您不是按照代码行数付费的话,MatrixGraph(unsigned n) : M(n, vector<double>(n)) {} - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接