3

タイプのメンバー変数 M を持つ MatrixGraph クラスがあります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
}

そして、私が試した2番目の方法はここで見つけましたが、それもうまくいきませんでした:

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

ここで、エラーが発生する前のコールスタックの最後の行についてコメントしました。コール スタックの次の行は、クラス ベクトルを示しており、Pos がベクトルのサイズより大きいことを示しています。これはサイズゼロの行列だと思いますが、なぜ大きくできないのかわかりません。助言がありますか?

ありがとう!

4

2 に答える 2

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

これも可能です。これはよりクリーンなコードですが、余分なベクトル オブジェクトを 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でいっぱいの一時ベクトルで初期化することです

于 2012-11-16T02:28:49.250 に答える
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
}
于 2012-11-16T02:24:36.387 に答える