Inserimento di elementi nel vettore multidimensionale

vector<vector> sort_a; vector v2; vector 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); } } 

Il vettore sort_a dovrebbe essere un array 4×4, invece l’output è 31×1 con molti elementi vuoti, come posso inserire elementi in un vettore multidimensionale?

Non pensarlo come un vettore multidimentale, pensalo come un vettore di vettori.

 int n = 4; std::vector> vec(n, std::vector(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; } } 

Ho incluso parentesi in (vec[i])[j] solo per la comprensione.

Modificare:

Se vuoi riempire il tuo vettore tramite push_back , puoi creare un vettore temporaneo nel ciclo interno, riempirlo e quindi reinserirlo nel vettore:

 for (int i = 0; i < n; i++) { std::vector temp_vec; for (int j = 0; j < n; j++) { temp_vec.push_back(j); } vec.push_back(temp_vec); } 

Tuttavia, push_back chiamate push_back traducono in un codice più lento, dal momento che non solo è necessario riallocare il vettore in ogni momento, ma anche creare un temporaneo e copiarlo.

un vector> non è la migliore implementazione per una memoria multidimensionale. Il seguente impianto funziona per me.

 template class array_2d { std::size_t data; std::size_t col_max; std::size_t row_max; std::vector 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]; } }; 

caso d’uso:

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

Questa soluzione è simile a quella descritta qui .