C++ 例による配列の動的割り当て
動的配列とは何ですか?
動的配列は通常の配列と非常に似ていますが、そのサイズはプログラムの実行中に変更できます。 DynamArray 要素はメモリの連続ブロックを占有します。
配列が作成されると、そのサイズは変更できません。 ただし、動的配列は異なります。 動的配列は、いっぱいになった後でもサイズを拡張できます。
配列の作成中に、所定の量のメモリが割り当てられます。 動的配列の場合は、必要に応じてメモリ サイズが特定の係数で増加するため、これは当てはまりません。
動的配列のパフォーマンスに影響を与える要因
アレイの初期サイズと成長係数によってパフォーマンスが決まります。次の点に注意してください。
- 配列のサイズと成長率が小さい場合、メモリの再割り当てがより頻繁に行われます。 これにより、アレイのパフォーマンスが低下します。
- 配列のサイズが大きく、成長係数が大きい場合、未使用のメモリが大量に発生します。このため、サイズ変更操作に時間がかかる場合があります。これにより、配列のパフォーマンスが低下します。
新しいキーワード
In C++、 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 名前空間を呼び出さずにそのクラスを使用するには、プログラムに std 名前空間を含めます。
- main() 関数を呼び出します。 プログラム ロジックは関数の本体内に追加する必要があります。
- XNUMX つの整数変数 x と n を宣言します。
- ユーザーに変数 n の値の入力を求めるテキストをコンソールに出力します。
- キーボードからユーザー入力を読み取り、それを変数 n に割り当てます。
- 合計 n 個の整数を保持する配列を宣言し、それをポインター変数 *arr に代入します。
- ユーザーに n 個の項目の入力を求めるメッセージを出力します。
- for ループを使用してループ変数 x を作成し、ユーザーが入力した項目を反復処理します。
- ユーザーが入力した要素を読み取り、配列 arr に格納します。
- 本体の端 forループ.
- コンソールにテキストを出力します。
- for ループを使用してループ変数 x を作成し、配列の項目を反復処理します。
- arr という名前の配列に含まれる値をコンソールに出力します。
- for ループの本体の終わり。
- プログラムは正常に完了すると値を返す必要があります。
- main() 関数の本体の終わり。
注: 上記の例では、ユーザーは実行時に配列の任意のサイズを指定できます。 これは、配列のサイズが実行時に決定されることを意味します.
動的に割り当てられた配列の初期化
動的配列を 0 に初期化するのは簡単です。
構文:
int *array{ new int[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[] を使用する必要があります。 [] は、XNUMX つの変数ではなく複数の変数を削除するように 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 ヘッダー ファイルの機能を使用するには、プログラムに iostream ヘッダー ファイルをインクルードします。
- std 名前空間を呼び出さずにそのクラスを使用するには、プログラムに std 名前空間を含めます。
- main() 関数を呼び出します。 プログラム ロジックは関数の本体内に追加する必要があります。
- 整数データ型の XNUMX つの変数 x と n を宣言します。
- コンソールにテキストを出力します。テキストでは、ユーザーに入力する数字の数を尋ねます。
- キーボードからのユーザー入力を読み取ります。 入力値は変数 n に代入されます。
- ポインタ変数 *arr を宣言します。 配列 arr は、合計 n 個の整数を格納するためにメモリを予約します。
- ユーザーに n 個の数値を入力するよう促すメッセージをコンソールに表示します。
- ユーザーが入力した数値を反復処理するための for ループとループ変数 x を作成します。
- ユーザーが入力した数値を読み取り、配列 arr に格納します。
- for ループの本体の終わり。
- コンソールにテキストを出力します。
- for ループとループ変数 x を使用して、配列 arr の内容を反復処理します。
- 配列 arr の値をコンソールに出力します。
- for ループの本体の終わり。
- コンソールに空の行を出力します。
- 配列 arr のメモリを解放します。
- プログラムは正常に完了すると値を返します。
- main() 関数の本体の終わり。
まとめ
- 通常の配列のサイズは固定です。 一度宣言したサイズは変更できません。
- これらのタイプの配列では、メモリ サイズはコンパイル時に決定されます。
- 動的配列は異なります。 サイズは実行時に変更できます。
- 動的配列では、サイズは実行時に決定されます。
- 動的配列 C++ new キーワードを使用して宣言されます。
- 動的配列に格納する項目の数を指定するには、角括弧を使用します。
- 配列の処理が完了したら、delete 演算子を使用してメモリを解放できます。
- すべての配列要素のメモリを解放するには、[] と共に delete 演算子を使用します。
- [] を指定せずに削除すると、単一要素のメモリのみが解放されます。
- サイズを変更する組み込みのメカニズムはありません C++ 配列。
- リスト初期化子を使用して配列を初期化する場合、「=」演算子は使用しません。