C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。

下図は、3×4の2次元配列のイメージです。

C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

アルゴリズム

C++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。

Begin
    配列の寸法(行数・列数)を宣言する。
    new を使って 2次元配列 a[][] を動的に確保する。
    配列に要素を代入する。
    配列の内容を出力する。
    delete でメモリを解放する。
End

サンプルコード

まず new int*[B] で「int型へのポインタ」をB個持つ配列を確保し、その後ループ処理で各行ごとに new int[A] でA個分のint型領域を割り当てます。これにより、行数B・列数Aの2次元配列が完成します。

#include <iostream>
using namespace std;

int main() {
    int B = 4; // 行数
    int A = 5; // 列数

    // ポインタ配列を動的に確保
    int** a = new int*[B];
    for(int i = 0; i < B; ++i)
        a[i] = new int[A]; // 各行の配列を確保

    // 配列に値を代入
    for(int i = 0; i < B; ++i)
        for(int j = 0; j < A; ++j)
            a[i][j] = i;

    // 配列の内容を出力
    for(int i = 0; i < B; ++i)
        for(int j = 0; j < A; ++j)
            cout << a[i][j] << "\n";

    // メモリを解放(各行→最後にポインタ配列の順)
    for(int i = 0; i < B; ++i)
        delete [] a[i];
    delete [] a;

    return 0;
}

ポイント:メモリ解放の順序

確保したメモリは、必ず各行の配列を先にdeleteし、最後にポインタ配列自体をdeleteするのが正しい手順です。この順序を守らないとメモリリークや未定義動作の原因になります。

実行結果

各行のすべての要素に行番号の値(i の値)が代入されているため、出力は以下のようになります。

0
0
0
0
0
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3

まとめ

C++では、new演算子を使うことで実行時にサイズを決定できる2次元配列を柔軟に扱えます。ただし、使い終わったメモリを必ずdeleteで解放すること、また現代のC++ではstd::vector<std::vector<int>>などRAIIに対応したコンテナを使えば自動的なメモリ管理が可能になる点も覚えておくとよいでしょう。

  1. OpenCVとC++を使った色追跡の実装方法:HSV変換から軌跡の描画まで

    色追跡(カラートラッキング)は、色検出とよく似た画像処理です。追跡を実現するには、検出したオブジェクトの面積を計算し、その領域の現在位置を求める処理を数行追加します。最後に、OpenCVのline()関数を使って、オブジェクトが移動した軌跡を線として描画します。 この記事では、トラックバーでHSVのしきい値をリアルタイムに調整しながら、Webカメラの映像から特定色のオブジェクトを検出し、その動きを追跡する方法を解説します。 色追跡の基本的な流れ 映像の取得:VideoCaptureクラスでWebカメラからフレームを取得します。 HSVへの変換:cvtColor()関数でBGR画像をHSV形

  2. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ