我有一个称为array [9] [7]的数组。现在,我要启动一个空数组(如何执行此操作?),并用该数组的内容覆盖该数组[9] [7]。
因此,在特定情况下,我想将数组[9] [7]复制到新数组中。我该如何处理?
我尝试过:
newarray[];
array[9][7] = ....
newarray[] = array[9][7];
不起作用。
答案 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