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で、空の要素がたくさんあります。多次元ベクトルに要素を挿入するにはどうすればよいですか?

4

2 に答える 2

9

多次元ベクトルとは考えないでください。ベクトルのベクトルと考えてください。

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は、内側のループに一時的なベクトルを作成し、それを塗りつぶしてから、ベクトルにプッシュバックすることができます。

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ベクトルを常に再割り当てする必要があるだけでなく、一時的なものを作成してコピーする必要があるため、呼び出しによってコードが遅くなります。

于 2012-12-18T15:59:58.227 に答える
4

avector<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;

このソリューションは、ここで説明するソリューションと似ています。

于 2012-12-18T16:28:31.963 に答える