2012-12-18 7 views
6
vector<vector<int>> sort_a; 
vector<int> v2; 
vector<int> v3; 

for (int i=0; i<4; ++i) { 
v2.push_back(i); 

    for (int j=0; j<4; ++j) { 
    v3.push_back(j); 
    sort_a.push_back(v2); 
    sort_a.push_back(v3); 
    } 

} 

ベクトルsort_aは4x4配列でなければならず、空の要素がたくさんある出力は31x1です。要素を多次元ベクトルに挿入するにはどうすればよいですか?多次元ベクトルに要素を挿入する

答えて

6

多次元ベクトルとは考えてはいけません。それをベクトルのベクトルと考えてください。

int n = 4; 
std::vector<std::vector<int>> vec(n, std::vector<int>(n)); 

// looping through outer vector vec 
for (int i = 0; i < n; i++) { 
    // looping through inner vector vec[i] 
    for (int j = 0; j < n; j++) { 
    (vec[i])[j] = i*n + j; 
    } 
} 

私は了解のため(vec[i])[j]にかっこを入れました。

編集:

あなたがpush_back経由であなたのベクトルを記入したい場合は、内側のループで一時的なベクトルを作成し、それを埋める、その後、あなたのベクトルにそれを一backことができます。

for (int i = 0; i < n; i++) { 
    std::vector<int> temp_vec; 

    for (int j = 0; j < n; j++) { 
    temp_vec.push_back(j); 
    } 

    vec.push_back(temp_vec); 
} 

しかし、push_backの呼び出しは、ベクトルを常に再割り当てする必要があるだけでなく、一時的なコードを作成してコピーする必要があるため、コードの実行速度が遅くなります。

+1

これは、ベクトルの最後を超えて書き込みを試みます。 – interjay

+0

要素を予約することで、[] []メソッドを使用して値を渡すことができますが、不要な割り当てがたくさんあったので、必要なときにのみプッシュバックと挿入の値を使用したいと思いました。 –

+0

@interjay:申し訳ありませんが何らかの理由で、ベクターがすでに適切にサイズ変更されていると思いました。 – prazuber

3

vector<vector<int>>は、多次元ストレージのための最良の実装ではありません。次の移植が私のために働く。

template<typename T> 
class array_2d { 
    std::size_t data; 
    std::size_t col_max; 
    std::size_t row_max; 
    std::vector<T> a; 
public: 
    array_2d(std::size_t col, std::size_t row) 
     : data(col*row), col_max(col), row_max(row), a(data) 
    {} 

    T& operator()(std::size_t col, std::size_t row) { 
     assert(col_max > col && row_max > row) 
     return a[col_max*col + row]; 
    } 
}; 

ユースケース:

array_2d<int> a(2,2); 
a(0,0) = 1; 
cout << a(0,0) << endl; 

この溶液は、hereを記載したものと同様です。

+0

コンストラクタのイニシャライザリストでベクトル 'a'を初期化し、' rezize'の呼び出しを避けることができます。これにより、1回の再割り当てを回避できます。 – juanchopanza

+0

@juanchopanzaが編集しました、ありがとうございます。 – andre

関連する問題