1. ホーム
  2. c++

[解決済み】C++でnewを使って2次元配列を宣言するには?

2022-05-01 01:20:08

質問

2次元の配列をnewで宣言するには?

例えば、通常の配列の場合、次のようになります。

int* ary = new int[Size]

しかし

int** ary = new int[sizeY][sizeX]

a) 動作しない/コンパイルできない、b) 何を達成するのかわからない。

int ary[sizeY][sizeX] 

が行います。

解決方法は?

行の長さがコンパイル時の定数である場合、C++11 では、以下のことが可能です。

auto arr2d = new int [nrows][CONSTANT];

参照 この回答 . C++の拡張機能として可変長配列を許可しているgccのようなコンパイラは new このように を使えば、C99のように完全にランタイム可変な配列次元の機能が得られますが、ポータブルなISO C++では、可変なのは最初の次元だけという制限があります。

もう1つの効率的な方法は、大きな1次元配列に対して手動で2次元のインデックス付けを行うことです。 別の回答では このため、実際の2D配列と同じようにコンパイラで最適化することができます(例えば、配列が互いにエイリアスやオーバーラップしないことを証明したり、チェックしたりします)。


それ以外の場合は 配列へのポインタ を使用すると、効率的な単一の大きなアロケーションではないものの、連続した2D配列のような2D構文が可能になります。このように、ループを使って初期化することができます。

int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
    a[i] = new int[colCount];

上記は colCount= 5rowCount = 4 とすると、次のようになる。

を忘れないでください。 delete をループして、各行ごとにポインタの配列を削除します。 の例 別解 .