2012-12-18 19 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); 
    } 

} 

Wektor sort_a powinien być tablicą 4x4, zamiast tego wyjście ma 31x1 z dużą ilością pustych elementów, jak wstawić elementy do wielowymiarowego wektora?Wstawianie elementów wielowymiarowych Wektor

Odpowiedz

6

Nie myśl o tym, że jest to wektor wielowymiarowy, uważaj go za wektor wektorów.

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

włączyłem nawiasów w (vec[i])[j] tylko do zrozumienia.

Edit:

Jeśli chcesz, aby wypełnić swój wektor poprzez push_back, można utworzyć tymczasowy wektora w pętli wewnętrznej, wypełnić go, a następnie push_back go do wektora:

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); 
} 

Jednak wywołania push_back skutkują wolniejszym kodem, ponieważ nie tylko trzeba ponownie przesyłać swój wektor przez cały czas, ale także trzeba utworzyć tymczasowy i skopiować go.

+1

Spowoduje to zapisanie tekstu poza końcem wektorów. – interjay

+0

Przez rezerwowanie elementów mogę używać metody [] [] do przekazywania wartości, ale ponieważ było dużo niechcianych przydziałów, chciałem użyć wartości odsuwania i wstawiania tylko w razie potrzeby, jak to zrobić? –

+0

@interjay: przykro mi, z jakiegoś powodu myślałem, że wektory zostały już odpowiednio przeskalowane. – prazuber

3

a vector<vector<int>> nie jest najlepszym rozwiązaniem do wielowymiarowego przechowywania. Następna implantacja działa dla mnie.

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]; 
    } 
}; 

przypadek użycia:

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

Rozwiązanie to jest podobne do opisanego here.

+0

Można zainicjować wektor 'a' na liście inicjalizacyjnej konstruktora, a tym samym uniknąć wywołania' rezize'. W ten sposób uniknie się jednej alokacji. – juanchopanza

+0

@juanchopanza edytowane, dzięki. – andre

Powiązane problemy