c ++,通过delete [] x [i]缩小动态数组

时间:2012-04-08 17:56:41

标签: c++ dynamic-arrays

我有一个大小为4(4行)的2D数组。要使数组大小为2(2行),我可以使用以下命令吗? (因为我们的hw赋值细节没有指定,代码应该适用于常见的c ++标准)

我正在删除数组的后半部分。

const int newSize = flightsArraySize/2;
for(int i = newSize-1; i < flightsArraySize-1; i++)
   delete [] flights[i];

或者我是否必须重新创建大小为2的航班数组?

2 个答案:

答案 0 :(得分:1)

假设您使用new创建了一个2D数组:

int **arr = new int*[rows];
for(int i=0; i<rows; ++i)
    arr[i] = new int[cols];

然后要调整大小,您必须执行以下操作:

int newRows = rows/2;

// Create a new array for the right number of rows.
int **newArr = new int*[newRows];

// Copy the rows we're keeping across.
for(int i=0; i<newRows; ++i)
    newArr[i] = arr[i];

// Delete the rows we no longer need.
for(int i=newRows; i<rows; ++i)
    delete[] arr[i];

// Delete the old array.
delete[] arr;

// Replace the old array and row count with the new ones.
arr = newArr;
rows = newRows;

但严重的是,如果你只使用矢量,这就容易多了:

std::vector<std::vector<int>> v(rows);
for(int i=0; i<rows; ++i)
    v[i].resize(cols);
v.resize(v.size()/2);

答案 1 :(得分:0)

好吧,它解除了指向后半部分指针的内存。但是诗人们自己会留下来,指针的数量也不会缩短。

修改

哦,抱歉。这似乎是一个错误。如果你有这样的代码:

int **ptr = new int*[4];

for(int i = 0; i < 4; i++)
{
    ptr[i] = new int[4];
}

然后键入

delete[] ptr[3];

它将删除整个数组,因此您可以像这样创建新的:

ptr[3] = new int[any_number];
这是什么意思?对不起,我看得太快了......