自定义复制动态数组

Custom copying dynamic array

本文关键字:数组 动态 复制 自定义      更新时间:2023-10-16
如何

像这样复制动态数组:复制数组的所有元素,但不是从 0 索引开始,而是从第一个数组开始。

//We have array x, which have 5 elements, and array y, which have 6 elements;
y[1]=x[0];
y[2]=x[1];
//etc...

附言不想逐个元素复制,我可以以这种方式使用std::copymemcpy吗?

编辑:重新分配数组的方法比这更有效吗?

int* arr = new int[20];
...
//wanna resize to 25?
int* temp = new int[25];
std::copy(arr, arr+20, temp);
delete [] arr;
arr = temp;
... //now arr has 25 elements

但不使用矢量或其他 stl 对象。

std::copy 使用迭代器,因此您可以将目标迭代器递增 1:

对于固定大小的数组和 C++11,这应该有效:

std::copy( std::begin(x), std::end(x), std::begin(y)+1 )

对于动态数组,std::end 不起作用,但可以使用指针算法:

std::copy( x, x+5, y+1 )

您可以使用std::copy或任何适当的内存复制/移动函数(memcpymemmove区域是否重叠),后者是因为您的对象类型(uint8_t)是可以简单复制分配的。

您还应该知道,如果您的类型是微不足道的可复制可分配的(uint8_t),std::copy可能会为您执行后者。这不是一个要求(至少我不知道,我相信我会听到它),但我见过的每个供应商都为微不足道的可复制分配对象提供了一个 SFINAE 解决方案,以简单地执行memmove以提高效率。

简而言之,您可能会得到您想要的std::copy

std::copy(x, x+x_len, y+1);

并确保y至少有 x_len+1 个可用插槽。