我有一个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大于我的向量的大小。我假设这是一个零大小的矩阵,但我不知道为什么我不能让它更大。有什么建议?
谢谢!
答案 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)
这应该这样做:
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
}