2017-02-02 77 views
1

我有兩個A類和B都有一個成員象下面這樣:的std ::副本不正常工作

class A { 
    ... 
    std::vector<std::vector<std::vector<size_t>>> grid; 
} 

class B { 
    ... 
    std::vector<std::vector<std::vector<size_t>>> grid; 
} 

我發現,當我使用std ::複製到從A ::電網到B複製:: grid,它會失敗。 這裏是我做的:

// Here is in B's constructor. 
// I initialize B::grid with the same size of A::grid 
grid = vector<vector<vector<size_t>>>(GetSetting().grid_cols()); 
for (int i = 0; i < GetSetting().grid_cols(); i++) { 
    grid[i] = vector<vector<size_t>>(GetSetting().grid_rows()); 
    for (int j = 0; j < GetSetting().grid_rows(); j++) { 
    grid[i][j].reserve(a.grid[i][j].size()); 
    } 
} 

// Copy from A to B 
std::copy(a.grid.begin(), a.grid.end(), std::back_inserter(grid)); 

但如果我刪除初始化部分,那麼性病::複製將正常工作。 初始化部分有什麼問題?

+1

爲什麼地球上你沒有簡單地使用'grid = a.grid;'? –

+0

@ T.C. ,我也嘗試使用operator =()並且它可以正常工作。我只是想知道什麼是錯誤的,因爲我使用std :: copy :) – Josper

回答

1

讓我給你看一個簡單的例子。

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1; 
std::copy(v.begin(), v.end(), std::back_inserter(v1)); 

在這種情況下,v1將按預期方式爲1,2,3。現在考慮這個:

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1(3); //v1 has initial size!! 
std::copy(v.begin(), v.end(), std::back_inserter(v1)); 

現在V1爲0,0,0,1,2,3,因爲back_inserterpush_back秒。如果您已經在目標分配所需的大小,然後用begin()迭代器,而不是back_insert_iterator

std::vector<int> v = {1, 2, 3}; 
std::vector<int> v1(3); //v1 has initial size!! 
std::copy(v.begin(), v.end(), v1.begin()); //use begin here 

V1是1,2,3,符合市場預期。

+0

感謝您的回答,它真的讓我感到困惑。我可以問另一個問題嗎?當我修改grid [i] [j] .reserve(a.grid [i] [j] .size());到網格[i] [j] .resize(a.grid [i] [j] .size());並使用back_inserter,它也可以正常工作。有什麼區別保留和調整大小?我知道儲戶只是保留一個緩衝區,調整大小將初始化值。但爲什麼調整大小會正常工作? – Josper

+0

@Josper:我不認爲你用grid [i] [j]做的任何事情,不管它是否調整大小都會有什麼影響。重要的是您是否調整網格本身的大小 –