将 std::copy() 与 std::back_inserter() 一起使用
Using `std::copy()` with `std::back_inserter()`
我有两个 class A 和 B 都有如下成员:
class A {
...
std::vector<std::vector<std::vector<size_t>>> grid;
}
class B {
...
std::vector<std::vector<std::vector<size_t>>> grid;
}
我发现当我使用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));
但是如果我删除初始化部分,那么 std::copy 将正常工作。
初始化部分有什么问题?
让我用一个简单的例子给你看。
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_inserter
push_back
s。如果您已经在目标中分配了必要的大小,则使用 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。
我有两个 class A 和 B 都有如下成员:
class A {
...
std::vector<std::vector<std::vector<size_t>>> grid;
}
class B {
...
std::vector<std::vector<std::vector<size_t>>> grid;
}
我发现当我使用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));
但是如果我删除初始化部分,那么 std::copy 将正常工作。 初始化部分有什么问题?
让我用一个简单的例子给你看。
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_inserter
push_back
s。如果您已经在目标中分配了必要的大小,则使用 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。