2017-02-02 14 views
1

私は2つのクラス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; 
} 

私はBにA ::グリッドからコピーするにはstd ::コピーを使用するときに私が見つけました:: 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)); 

しかし、私は一部の初期化削除した場合、その後のstd ::コピーが正常に動作します。 初期化部分の何が問題になりますか?

+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のため、次のようになります。今、この検討してください。予想通り

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は、2、3、1:あなたはすでに先に必要なサイズを割り当てた場合は、begin()イテレータではなくback_insert_iteratorを使用しています。

+0

あなたの答えをありがとう、本当に私を混乱させる。別の質問をしてもよろしいですか? grid [i] [j] .reserve(a.grid [i] [j] .size())を変更すると、グリッド[i] [j] .resize(a.grid [i] [j] .size()); back_inserterを使用すると、うまく動作します。違いは何ですか?私は予約がバッファを保持していることを知っていると、サイズを初期化するサイズを変更します。しかし、なぜサイズ変更が正しく機能するのでしょうか? – Josper

+0

@ジョパーパー:グリッドで何もしないと思いますが、リザーブのサイズを変更すると効果があります。重要なのは、グリッド自体のサイズを変更するかどうかです –

関連する問題