7

ベクトルを使用して 2D 配列を作成しようとしています。私は次のコードを書きました:

int main() {
    vector< vector<int> > v;

    int i, j;
    for(i=0; i<11; i++)
        for(j=0; j<11; j++)
            v[i].push_back(j);
    for(i=0; i<11; i++) {
        for(j=0; j<11; j++)
            cout<<v[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

ここで、0 から 10 までの数字を 11 回 (毎回新しい行に) 表示することを期待していました。しかし、コードは実行時エラー (セグメンテーション違反) を与えています。誰が私が間違っているのか教えてもらえますか?

ありがとう。

4

5 に答える 5

9

何かのベクトルを宣言すると、まだ要素がありません。

したがって:

v[i].push_back(j)

位置 i のベクトル v 内の存在しないベクトルに j を挿入しようとしています。

この場合、サイズがわかっているので、コンストラクターで必要な要素の数でベクターを初期化する必要があります。

vector<vector<int> > v(11);

これにより、ベクトル v が内部に 11 個の空のベクトルで初期化されます。

于 2013-10-21T12:13:17.330 に答える
1

使用できないメモリにアクセスしようとすると、セグメンテーション違反が発生します。通常、ベクトルを使用する場合、これはベクトルの外側にある (高すぎる、または低すぎる) 要素にアクセスしていることを意味します。

a を使用するときは、オーバーランを防ぐため、vector常にsize()あなたの関数を使用してください。for loops行くことによってベクトルサイズの外の要素にアクセスする可能性が非常に高いです0...10(それは11個の要素を返しますが、とにかく初期化されていません)。

于 2013-10-21T12:12:54.503 に答える
1

ベクトルの最初のレベルを初期化していません。

for(i=0; i<11; i++)
    vector<int> subVector;
    v.push_back(subVector);
    for(j=0; j<11; j++)
        v[i].push_back(j);
于 2013-10-21T12:13:06.780 に答える
0

新しいベクターを作成すると、デフォルトでは要素がありません。push_back() を使用して要素を挿入する必要があります。あなたの場合、ベクトルに以前に要素を入力していませんでした。まだ存在していないそのベクトルの i 番目の位置に要素を挿入しようとしています。

したがって、ベクトルのサイズを明示的に定義する必要があります。つまり、

vector<vector<int> > v(10);

これで、ベクトルは 10 個の要素があることがわかりました。

それが役に立てば幸い。ハッピーコーディング!

于 2019-05-19T20:31:57.083 に答える