用数组覆盖数组

时间:2019-06-03 16:01:40

标签: c++

我有一个称为array [9] [7]的数组。现在,我要启动一个空数组(如何执行此操作?),并用该数组的内容覆盖该数组[9] [7]。

因此,在特定情况下,我想将数组[9] [7]复制到新数组中。我该如何处理?

我尝试过:

newarray[];
array[9][7] = ....

newarray[] = array[9][7];

不起作用。

1 个答案:

答案 0 :(得分:2)

数组不可分配。

您可以将一个数组的元素复制到另一个数组中。有一种用于复制元素的标准算法:

std::copy(std::begin(src), std::end(src), std::begin(dest));

但是,此算法要求元素是可分配的。但是数组的元素是数组,因此无法分配。

您可以改用以下内容:

int array[9][7] = ...;
int newarray[9][7];

constexpr auto count = std::size(array) * std::size(array[0]);
std::copy(array[0], array[0] + count, newarray[0]);

这是基于这样一个假设,即跨子数组边界的迭代是定义明确的,而该标准可能无法保证(标准的解释不同)。

如果您认为上述内容未定义,则可以改用std::memcpy,但请记住,这要求元素可以被平凡地复制:

std::memcpy(newarray, array, sizeof array);

另一种方法是将数组包装在一个类中。编译器为类生成隐式的特殊成员函数,并且它们都是可复制构造的和可复制分配的。这是使用副本分配的示例:

struct Wrapper {
    int arr[9][7];
};

Wrapper array = ...;
Wrapper newarray;
newarray = array;

您不一定需要自己编写包装器。标准库为您提供了此类包装的模板:std::array。这是一个使用复制构造和类型推导的示例:

std::array<9, std::array<7, int>> array = ...;
auto newarray = array; // has same type