2016-04-19 7 views
0

要するに、このベクトルのベクトルの定義は正しいですか?これは**正しいベクトルのベクトルですか?すべてのベクトルのすべての値をどのように出力するのですか?

// Create a dynamic vector which contain another 3 vectors 
vector<int> **list = new vector<int>*[3](); 
// Create and initialize vectors that related to a vector 
for (unsigned short i = 0; i < 3; i++) { 
    list[i] = new vector<int>(i); 
} 

ここでは、すべてのベクターのすべての要素を印刷します。

for (unsigned short i = 0; i < 3; i++) { 
    for (unsigned short io = 0; io < 3; io++) { 
     cout << list[i]->at(io) << endl; 
    } 
    cout << "/n"; 
} 

ただし、次のランタイムエラーが表示されます。

+4

動的なベクトル配列ではなく、ベクトルのベクトルを使用しないのはなぜですか? – NathanOliver

+3

私はベクトルへのポインタを使用する正当な必要性を見たことがない – SergeyA

+3

ベクトルへのポインタの配列?あまりにも複雑です。 –

答えて

4

あなたのコードが間違っている:

// Create a dynamic vector which contain another 3 vectors 
vector<int> **list = new vector<int>*[3](); 

いいえ、これはvector<int>*に3つのポインタの配列を作成します。

// Create and initialize vectors that related to a vector 
for (unsigned short i = 0; i < 3; i++) { 
    list[i] = new vector<int>(i); 
} 

はい、しかし...あなたは本当に、0の大きさを持っているあなたの最初のベクトル、1の2番目の大きさをしたいですか...?

cout << list[i]->at(io) << endl; 

あなたはそうlist[i]->atが正しいですが、あなたの最初のベクトルので、サイズ0が、このコードは失敗し、vector<int>*である、list[i]を初期化しました。初期化はどの

vector<vector<int>> list(3, vector<int>(3)); 

vector含む3 vector<int>、3 int型を含む各1(3x3の行列):あなたはおそらく欲しい

*です。

* C++ 03を使用する場合はvector< vector<int> >を使用してください。

その後、反復(あなたが何かにそれを初期化していないので、唯一0出力などを得る)ことができます。

for (unsigned short i = 0; i < 3; i++) { 
    for (unsigned short io = 0; io < 3; io++) { 
     cout << list[i][io] << endl; 
    } 
    cout << "/n"; // Should be "\n" 
} 

または範囲ベースループ(C++ 11)とのより良い:

for (auto const &row: list) { 
    for (auto const &val: row) { 
     cout << val << " "; 
    } 
    cout << "\n"; 
} 
+0

'int val'は' auto val'よりも短いです。なぜ読みにくいのかわからないのですか? – Chiel

+0

@Chiel 'auto'は単なる* short *コードではありません。私はなぜこの場合は 'auto const&'ではないのか不思議です。 –

+0

@BartekBanachewicz。私は同意します、しかし、なぜあなたは 'int'についての明白な間にこのケースでauto valを書いていますか? – Chiel

関連する問題