gpt4 book ai didi

c++ - 使用 `std::copy()` 和 `std::back_inserter()`

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:06 26 4
gpt4 key购买 nike

我有两个 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_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

v1 是 1、2、3,正如预期的那样。

关于c++ - 使用 `std::copy()` 和 `std::back_inserter()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com