C++動的配列の確保をマスター:コード例付き実践ガイド
動的配列とは
動的配列は通常の配列とよく似ていますが、プログラム実行中にサイズを変更できます。動的配列の要素は連続したメモリブロックを占有します。
通常の配列は作成後サイズを変更できません。しかし動的配列は異なります。動的配列は満杯になってもサイズを拡張できます。
通常の配列作成時には所定量のメモリが割り当てられます。動的配列では必要に応じて一定の倍率でメモリサイズを拡大します。
このC++チュートリアルでは以下を学びます:
- 動的配列とは
- 動的配列のパフォーマンスに影響する要因
newキーワード- 動的割り当て配列の初期化
- 配列のリサイズ
- 動的配列の削除
動的配列のパフォーマンスに影響する要因
配列の初期サイズと成長倍率がパフォーマンスを決定します。以下の点に注意:
- 配列サイズが小さく成長倍率も小さい場合、頻繁にメモリ再割り当てが発生しパフォーマンスが低下
- 配列サイズが大きく成長倍率も大きい場合、大量の未使用メモリを抱え、リサイズ操作に時間がかかりパフォーマンスが低下
newキーワード
C++ではnewキーワードで動的配列を作成できます。割り当てる要素数を角括弧で指定し、その前に型名を置きます。要求された数の要素が割り当てられます。
構文:
newキーワードの構文は以下の通り:
pointer_variable = new data_type;
- pointer_variable – ポインタ変数の名前
- data_type – 有効なC++データ型
- キーワードは最初の要素へのポインタを返す
動的配列作成後、deleteキーワードで削除できます。
例1:
#include<iostream>
using namespace std;
int main() {
int x, n;
cout << "Enter the number of items:" << "\n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " items" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You entered: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
return 0;
}
出力:
コードのスクリーンショット:
コード解説:
- iostreamヘッダをインクルードしてその関数を使用
- std名前空間をインクルードしてクラスを修飾なしで使用
- main()関数を呼び出し、プログラムロジックを本体に記述
- 整数変数x、nを宣言
- コンソールにテキストを出力し、ユーザーに変数nの値入力を促す
- キーボードからユーザー入力を読み取り、変数nに代入
- 合計n個の整数を保持する配列を宣言し、ポインタ変数*arrに割り当て
- ユーザーにn個のアイテム入力を促すメッセージを出力
- forループでループ変数xを作成し、ユーザーが入力したアイテムをイテレーション
- ユーザーが入力した要素を読み取り、配列arrに格納
- forループの本体終了
- コンソールにテキストを出力
- forループでループ変数xを作成し、配列のアイテムをイテレーション
- 配列arrに含まれる値をコンソールに出力
- forループの本体終了
- プログラムは正常完了時に値を返す
- main()関数の本体終了
注:上記例では、ユーザーが実行時に配列の任意のサイズを指定できます。つまり配列のサイズは実行時に決定されます。
動的割り当て配列の初期化
動的配列を0で初期化するのは簡単です。
構文:
int *array{ new int[length]{} };
上記構文で、lengthは配列に追加する要素数を表します。配列を0で初期化する必要があるため、中身は空のままにします。
初期化子リストを使って動的配列を初期化することもできます。これを示す例を作成しましょう。
例2:
#include <iostream>
using namespace std;
int main(void) {
int x;
int *array{ new int[5]{ 10, 7, 15, 3, 11 } };
cout << "Array elements: " << endl;
for (x = 0; x < 5; x++) {
cout << array[x] << endl;
}
return 0;
}
出力:
コードのスクリーンショット:
コード解説:
- iostreamヘッダをインクルード
- std名前空間をインクルード
- main()関数を呼び出し
- xという整数変数を宣言
- 初期化子リストを使って動的配列arrayを宣言。5つの整数要素を保持。配列長と初期化子リストの間に「=」演算子を使用していないことに注意
- コンソールにテキストを出力。endlは行末を意味するC++キーワードで、カーソルを次の行に移動
- forループで配列要素をイテレーション
- 配列arrayの内容をコンソールに出力
- forループの本体終了
- プログラムは正常完了時に値を返す
- main()関数の本体終了
配列のリサイズ
動的配列の長さは割り当て時に設定されます。
しかし、C++には一度割り当てられた配列をリサイズする組み込みメカニズムがありません。
この課題を克服するには、新しい配列を動的に割り当て、要素をコピーし、古い配列を削除します。
注:この手法はエラーを起こしやすいため、可能な限り避けるべきです。
動的配列の削除
動的配列は目的を果たした後、コンピュータメモリから削除すべきです。delete文でこれを実現できます。解放されたメモリ領域は別のデータセットを保持するために使用できます。ただし、動的配列をメモリから削除しなくても、プログラム終了時に自動的に削除されます。
注意:
動的配列をコンピュータメモリから削除するには、deleteではなくdelete[]を使用します。[]はCPUに単一変数ではなく複数変数を削除するよう指示します。動的配列を扱う際にdelete[]ではなくdeleteを使用すると、メモリリーク、データ破損、クラッシュなどの問題が発生する可能性があります。
例3:
#include<iostream>
using namespace std;
int main() {
int x, n;
cout << "How many numbers will you type?" << "\n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " numbers" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You typed: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
cout << endl;
delete [] arr;
return 0;
}
出力:
コードのスクリーンショット:
コード解説:
- iostreamヘッダをインクルード
- std名前空間をインクルード
- main()関数を呼び出し
- x、nという2つの整数変数を宣言
- コンソールにテキストを出力。ユーザーに入力する数の個数を尋ねる
- キーボードからユーザー入力を読み取り、変数nに代入
- ポインタ変数*arrを宣言。配列arrは合計n個の整数を格納するメモリを確保
- ユーザーにn個の数値入力を促すメッセージを出力
- forループとループ変数xを作成し、ユーザーが入力した数値をイテレーション
- ユーザーが入力した数値を読み取り、配列arrに格納
- forループの本体終了
- コンソールにテキストを出力
- forループとループ変数xを使い、配列arrの内容をイテレーション
- 配列arrの値をコンソールに出力
- forループの本体終了
- コンソールに空行を出力
- 配列arrのメモリを解放
- プログラムは正常完了時に値を返す
- main()関数の本体終了
まとめ:
- 通常の配列は固定サイズ。宣言後にサイズ変更不可
- これらの配列ではメモリサイズがコンパイル時に決定
- 動的配列は異なる。実行時にサイズ変更可能
- 動的配列ではサイズが実行時に決定
- C++の動的配列は
newキーワードで宣言 - 角括弧で動的配列に格納するアイテム数を指定
- 配列の役割が終わったら
delete演算子でメモリ解放 - 配列全体のメモリを解放するには
delete[]を使用 deleteのみ([]なし)では単一要素のメモリのみ解放- C++配列のリサイズに組み込みメカニズムはない
- 初期化子リストで配列を初期化する際は「=」演算子を使わない
C言語
- C# 配列をマスターする:宣言、初期化、操作
- C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
- C言語 動的メモリ確保: malloc, calloc, realloc, free をマスターする
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C++ switch文をマスター:構文、使い方、実践例
- C++構造体を実例で徹底解説
- C++ std::map完全ガイド:連想配列の実践的活用とコード例
- C++のstd::listをマスターする:構文、関数、実践例
- C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス
- Javaで選択ソート:ステップバイステップ例と完全コード