C++ 复制和调整使用 new 运算符初始化的已分配数组的大小

标签 c++ new-operator arrays

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::arraystd::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/

相关文章:

C++:写入文件

c++ - 如何在触发 QObject::connect 的代码中查明调用的位置:无法在 Qt5 中对类型的参数进行排队?

c# - 如何阻止新修改器?

php - 使用数组的数组填充表单选项列表

c++ - 如何在 C++ 中有效地将整个队列复制到 vector/数组?

c# - 创建一个新的 SaveFileDialog

c++ - 澄清 : What makes 'new' an operator in C++

php - 按键值对php多维数组进行排序

javascript - 为什么 [[GetPrototypeOf]] 是 Javascript 代理的不变量?

c++ - 追加 __FUNCTION__ 宏提供的字符串