C++ の new を使って 2 次元配列を宣言する方法
胡金庫
2023年10月12日
-
2 次元配列を宣言して
arr[x][y]
で要素にアクセスする記法 -
2 次元配列を宣言して
arr[]
記法で要素にアクセスする -
コンテナ
vector
を用いて動的な 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;
}
著者: 胡金庫