C++ の new を使って 2 次元配列を宣言する方法

  1. 2 次元配列を宣言して arr[x][y] で要素にアクセスする記法
  2. 2 次元配列を宣言して arr[] 記法で要素にアクセスする
  3. コンテナ vector を用いて動的な 2 次元配列を暗黙的に確保する

この記事では、new を用いて 2 次元配列を動的に宣言する複数の C++ メソッドを紹介します。

2 次元配列を宣言して arr[x][y] で要素にアクセスする記法

この解決策では,new キーワードを利用して,生成された行列構造体に配列表記法 [x][y] でアクセスできるようにします.まず,整数(int **)変数へのポインタへのポインタを宣言し,その配列に行サイズの int ポインタ配列を割り当てます.次に、このポインタ配列をループオーバーして、反復するたびに列サイズの int 配列を確保する。最後に,2 次元配列の操作が終わったら,割り当てられたメモリを解放する必要があります.解放は逆順ループで行われることに注意してください。

#include <iostream>
#include <iomanip>

using std::cout; using std::cin;
using std::endl; using std::setw;

constexpr int ROW = 4;
constexpr int COL = 6;

int main()
{
    int **matrix = new int*[ROW];
    for(int i = 0; i < ROW; ++i) {
        matrix[i] = new int[COL];
    }

    for(int i = 0; i < ROW; ++i) {
        for(int j = 0; j < COL; ++j) {
            matrix[i][j] = rand() % 100;
            cout << setw(2) << matrix[i][j] << "; ";
        }
        cout << endl;
    }

    for(int i = 0; i < ROW; ++i) {
        delete matrix[i];
    }
    delete [] matrix;
    return EXIT_SUCCESS;
}

出力:

83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;

2 次元配列を宣言して arr[] 記法で要素にアクセスする

この方法は単一の配列の割り当てを用いるので,プログラムの実行速度の点で効率的な方法である.そのため、[] 記法を用いて要素にアクセスする必要があります。この方法は、array のサイズが大きくなり、その要素に対する計算が非常に多くなる場合に推奨される方法である。また、この方法は再配置が容易になることにも注意する必要がある。

#include <iostream>
#include <iomanip>

using std::cout; using std::cin;
using std::endl; using std::setw;

constexpr int ROW = 4;
constexpr int COL = 6;

int main()
{
    int *matrix = new int[ROW * COL];

    for(int i = 0; i < ROW; ++i) {
        for(int j = 0; j < COL; ++j) {
            matrix[j * ROW + i] = rand() % 100;
            cout << setw(2) << matrix[j * ROW + i] << "; ";
        }
        cout << endl;
    }
    delete [] matrix;

    return EXIT_SUCCESS;
}

コンテナ vector を用いて動的な 2 次元配列を暗黙的に確保する

あるいは,vector コンテナを用いて動的な 2 次元配列を構築することもできます.この例では、4x6 の vector_2d 配列を初期化し、各要素に値 - 0 を指定します。この方法の最も良いところは、範囲ベースのループを使った柔軟な反復処理が可能なことです。

#include <iostream>
#include <vector>
#include <iomanip>

using std::cout; using std::vector;
using std::endl; using std::setw;

constexpr int ROW = 4;
constexpr int COL = 6;

int main()
{
    vector<vector<int> > vector_2d(ROW, vector<int> (COL, 0));

    for (auto &item : vector_2d) {
        for (auto &item1 : item) {
            item1 = rand() % 100;
            cout << setw(2) << item1 << "; ";
        }
        cout << endl;
    }
    return EXIT_SUCCESS;
}
comments powered by Disqus