int* array1 = new[ 10 ]( );
复制此阵列的正确方法是什么?以下是我的尝试。
int* array2 = array1;
话虽如此,以下是将值添加到完整数组1的正确方法吗?
int val = 2;
int* array2 = new[ 11 ]( );
for ( int i = 0; i < 10; i++ ) {
array2[ i ] = array1[ i ];
}
array2[ 10 ] = val;
delete [ ]array1;
还有一个问题,我如何获得数组中填充的空格量?
int* array1 = new[ 2 ];
array1[ 0 ] = 1;
// the resulting array would look like this { 1 };
我想获得初始化元素的数量,因此我不想为分配的数组可以容纳的元素数返回2,而是希望获得实际具有值的元素数量。我想这样做,所以我可以用我之前的代码替换array1的大小。
谢谢!
编辑:因为我的导师,我需要坚持使用c风格的数组。答案 0 :(得分:2)
int* array2 = array1;
将一个指针指定给另一个指针,即它复制存储在array1
中的地址,并使array2
也指向此地址。
如果您想在使用指针的同时制作深层副本,可以使用memcpy
:
int* array2 = new int[10];
memcpy(array2, array1, 10 * sizeof(int));
这是可怕的C式方法,你应该尽可能避免。
我能想到的唯一合理的解决方案是使用std::array
或std::vector
代替
C风格的数组。 std::vector
与数组不同的是一个对象,它有自己的赋值运算符(以及复制构造函数),可以按照您期望的方式复制它:
std::vector<int> vec1(10, 0); // 10 numbers initialized to 0
std::vector<int> vec2 = vec1; // note this actually calls copy constructor
std::vector<int> vec3(vec1); // the same as previous line
vec3 = vec1; // assignment that makes a deep copy for you
您可以从空的std::vector
开始,并使用其push_back
方法继续向其推送新元素,并随时调用其大小vec.size()
。另外:您不负责清理存储其元素的内存 - 如果您按照我在上面的代码中指出的那样使用它,这些是具有自动存储持续时间的对象,当它们超出范围时为您清理内存
答案 1 :(得分:1)
您的第一次尝试不会复制数组的内容,它只是创建一个指向数组开头的新指针。
添加值的方法看起来是正确的。
数组本身不记得您为哪些成员分配了值。如果你想跟踪“填充”的元素数量,你必须自己做。您可以将数组包装在模板类中,也可以将其称为myVector
。