2012-12-18 42 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應該是一個4×4陣列,而不是輸出爲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填寫您的載體,你可以創建在內環臨時載體,填充它,然後它的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會導致代碼變慢,因爲不僅需要始終重新分配矢量,還必須創建臨時文件並將其複製。

+1

這將嘗試寫入超出矢量的末尾。 – interjay

+0

通過預留元素,我可以使用[] []方法來傳遞值,但由於有很多不需要的分配,我只想在需要時使用推回和插入值,我該怎麼做? –

+0

@interjay:對不起,出於某種原因,我認爲矢量已經適當調整大小。 – prazuber

3

a 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'。這可以避免一次重新分配。 – juanchopanza

+0

@juanchopanza編輯,謝謝。 – andre