int* array1 = new[ 10 ]( );
复制这个数组的正确方法是什么?以下是我的尝试。
int* array2 = array1;
话虽如此,以下是将值添加到完整 array1 的正确方法吗?
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 的大小替换我之前代码中的 10。
谢谢!
编辑:因为我的导师,我需要坚持使用 C 风格的数组。
最佳答案
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()
。另外:您不负责清理存储其元素的内存——如果您像我在上面的代码中指出的那样使用它,这些对象具有自动存储持续时间,当它们超出范围时会为您清理内存.
关于C++ 复制和调整使用 new 运算符初始化的已分配数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416582/