将`std :: copy()`与`std :: back_inserter()`一起使用

Jos*_*per 4 c++ copy std c++11

我有两个班级A和B都有一个成员,如下所示:

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

class B {
  ...
  std::vector<std::vector<std::vector<size_t>>> grid;
}
Run Code Online (Sandbox Code Playgroud)

我发现当我使用std::copy()从复制A::grid到时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));
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除了初始化部分,那么std :: copy将可以正常工作。初始化部分有什么问题?

Arm*_*yan 7

让我为您展示一个简化的示例。

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

在这种情况下,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));
Run Code Online (Sandbox Code Playgroud)

现在v1将是0、0、0、1、2、3,因为back_inserter push_backs。如果您已经在目标中分配了必要的大小,请使用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
Run Code Online (Sandbox Code Playgroud)

v1是预期的1、2、3。