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

胡金庫 2023年10月12日
  1. 2 次元配列を宣言して arr[x][y] で要素にアクセスする記法
  2. 2 次元配列を宣言して arr[] 記法で要素にアクセスする
  3. コンテナ vector を用いて動的な 2 次元配列を暗黙的に確保する
C++ の new を使って 2 次元配列を宣言する方法

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

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

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

#include <iomanip>
#include <iostream>

using std::cin;
using std::cout;
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 <iomanip>
#include <iostream>

using std::cin;
using std::cout;
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 <iomanip>
#include <iostream>
#include <vector>

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

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;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Array