0

サイズ4(4行)の2D配列があります。配列サイズを2(2行)にするには、次を使用できますか?(ハードウェア割り当ての詳細は指定されておらず、コードは一般的なC ++標準に適している必要があります)

アレイの後半を削除しています。

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

または、サイズ2のフライト配列を再作成する必要がありますか?

4

2 に答える 2

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);
于 2012-04-08T19:18:40.747 に答える
0

さて、それはポインタの後半を指しているメモリの割り当てを解除します。しかし、poiters自体は残り、ポインタの配列は短縮されません。

編集

あ、ごめんなさい。間違いのようです。このようなコードがある場合:

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];

これはどういう意味ですか?すみません、読みすぎです...

于 2012-04-08T18:01:24.193 に答える