自定义复制动态数组
Custom copying dynamic array
如何像这样复制动态数组:复制数组的所有元素,但不是从 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...
P.S。不想逐个元素复制,我可以这样使用 std::copy
或 memcpy
??
编辑:重新分配数组是否比这更有效?
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 使用迭代器,因此您可以将目标迭代器递增一个:
对于固定大小的数组和 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
或任何适当的记忆 copy/move 函数(memcpy
、memmove
如果区域重叠),后者是因为您对象类型 (uint8_t
) 是 trivially-copy-assignable。
您还应该知道 std::copy
将 可能 为您 完成后者 如果您的类型是普通复制分配(并且uint8_t
是这样)。这 不是 的要求(我至少 none 知道,如果是的话,我相信我会听到的)但是我接触过的每个供应商seen 为平凡复制可分配对象提供了 SFINAE 解决方案,为了提高效率,只需执行 memmove
。
简而言之,std::copy
您很可能会得到想要的东西
std::copy(x, x+x_len, y+1);
并确保 y
至少有 x_len+1
个空位。
如何像这样复制动态数组:复制数组的所有元素,但不是从 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...
P.S。不想逐个元素复制,我可以这样使用 std::copy
或 memcpy
??
编辑:重新分配数组是否比这更有效?
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 使用迭代器,因此您可以将目标迭代器递增一个:
对于固定大小的数组和 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
或任何适当的记忆 copy/move 函数(memcpy
、memmove
如果区域重叠),后者是因为您对象类型 (uint8_t
) 是 trivially-copy-assignable。
您还应该知道 std::copy
将 可能 为您 完成后者 如果您的类型是普通复制分配(并且uint8_t
是这样)。这 不是 的要求(我至少 none 知道,如果是的话,我相信我会听到的)但是我接触过的每个供应商seen 为平凡复制可分配对象提供了 SFINAE 解决方案,为了提高效率,只需执行 memmove
。
简而言之,std::copy
std::copy(x, x+x_len, y+1);
并确保 y
至少有 x_len+1
个空位。