工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++動的配列の確保をマスター:コード例付き実践ガイド

動的配列とは

動的配列は通常の配列とよく似ていますが、プログラム実行中にサイズを変更できます。動的配列の要素は連続したメモリブロックを占有します。

通常の配列は作成後サイズを変更できません。しかし動的配列は異なります。動的配列は満杯になってもサイズを拡張できます。

通常の配列作成時には所定量のメモリが割り当てられます。動的配列では必要に応じて一定の倍率でメモリサイズを拡大します。

このC++チュートリアルでは以下を学びます:

動的配列のパフォーマンスに影響する要因

配列の初期サイズと成長倍率がパフォーマンスを決定します。以下の点に注意:

  1. 配列サイズが小さく成長倍率も小さい場合、頻繁にメモリ再割り当てが発生しパフォーマンスが低下
  2. 配列サイズが大きく成長倍率も大きい場合、大量の未使用メモリを抱え、リサイズ操作に時間がかかりパフォーマンスが低下

newキーワード

C++ではnewキーワードで動的配列を作成できます。割り当てる要素数を角括弧で指定し、その前に型名を置きます。要求された数の要素が割り当てられます。

構文:

newキーワードの構文は以下の通り:

pointer_variable = new data_type;

動的配列作成後、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;
}

出力:

動的配列の入力・出力例

コードのスクリーンショット:

例1のソースコード

コード解説:

  1. iostreamヘッダをインクルードしてその関数を使用
  2. std名前空間をインクルードしてクラスを修飾なしで使用
  3. main()関数を呼び出し、プログラムロジックを本体に記述
  4. 整数変数x、nを宣言
  5. コンソールにテキストを出力し、ユーザーに変数nの値入力を促す
  6. キーボードからユーザー入力を読み取り、変数nに代入
  7. 合計n個の整数を保持する配列を宣言し、ポインタ変数*arrに割り当て
  8. ユーザーにn個のアイテム入力を促すメッセージを出力
  9. forループでループ変数xを作成し、ユーザーが入力したアイテムをイテレーション
  10. ユーザーが入力した要素を読み取り、配列arrに格納
  11. forループの本体終了
  12. コンソールにテキストを出力
  13. forループでループ変数xを作成し、配列のアイテムをイテレーション
  14. 配列arrに含まれる値をコンソールに出力
  15. forループの本体終了
  16. プログラムは正常完了時に値を返す
  17. 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;
}

出力:

初期化子リストによる動的配列の出力

コードのスクリーンショット:

例2のソースコード

コード解説:

  1. iostreamヘッダをインクルード
  2. std名前空間をインクルード
  3. main()関数を呼び出し
  4. xという整数変数を宣言
  5. 初期化子リストを使って動的配列arrayを宣言。5つの整数要素を保持。配列長と初期化子リストの間に「=」演算子を使用していないことに注意
  6. コンソールにテキストを出力。endlは行末を意味するC++キーワードで、カーソルを次の行に移動
  7. forループで配列要素をイテレーション
  8. 配列arrayの内容をコンソールに出力
  9. forループの本体終了
  10. プログラムは正常完了時に値を返す
  11. 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;
}

出力:

動的配列の確保・使用・解放の完全例

コードのスクリーンショット:

例3のソースコード

コード解説:

  1. iostreamヘッダをインクルード
  2. std名前空間をインクルード
  3. main()関数を呼び出し
  4. x、nという2つの整数変数を宣言
  5. コンソールにテキストを出力。ユーザーに入力する数の個数を尋ねる
  6. キーボードからユーザー入力を読み取り、変数nに代入
  7. ポインタ変数*arrを宣言。配列arrは合計n個の整数を格納するメモリを確保
  8. ユーザーにn個の数値入力を促すメッセージを出力
  9. forループとループ変数xを作成し、ユーザーが入力した数値をイテレーション
  10. ユーザーが入力した数値を読み取り、配列arrに格納
  11. forループの本体終了
  12. コンソールにテキストを出力
  13. forループとループ変数xを使い、配列arrの内容をイテレーション
  14. 配列arrの値をコンソールに出力
  15. forループの本体終了
  16. コンソールに空行を出力
  17. 配列arrのメモリを解放
  18. プログラムは正常完了時に値を返す
  19. main()関数の本体終了

まとめ:

C言語

  1. C# 配列をマスターする:宣言、初期化、操作
  2. C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
  3. C言語 動的メモリ確保: malloc, calloc, realloc, free をマスターする
  4. C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
  5. C++演算子を徹底解説:種類、例、サンプルプログラム付き
  6. C++ switch文をマスター:構文、使い方、実践例
  7. C++構造体を実例で徹底解説
  8. C++ std::map完全ガイド:連想配列の実践的活用とコード例
  9. C++のstd::listをマスターする:構文、関数、実践例
  10. C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス
  11. Javaで選択ソート:ステップバイステップ例と完全コード