読み込み中...

【C++】配列をマスターする8つの実例をプロが解説!初心者でも分かる完全ガイド

C++配列の基本と応用を図解するイメージ C++
この記事は約10分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事では、プログラミング初心者でも理解しやすいように、C++における配列の使い方を徹底的に解説します。

C++は多くの分野で使用される汎用プログラミング言語であり、配列はその中でも基本的かつ重要な概念の一つです。

この記事を読むことで、配列の基本から応用までを身に付け、C++プログラミングのスキルを高めることができるでしょう。

●C++と配列の基礎知識

C++でのプログラミングを学ぶ上で、配列は避けて通れない要素です。

配列とは、同一の型の変数を一定の順序で格納するためのデータ構造のことを指します。

C++における配列の理解は、効率的なデータ管理とアルゴリズムの実装に不可欠であり、プログラミングの基礎を築く上で重要な役割を果たします。

○配列とは何か?

配列は、複数の要素を一つの名前で管理するためのデータ構造です。

各要素はインデックスによってアクセスされ、インデックスは通常、0から始まります。

C++では、配列を使って複数のデータを効率的に処理することが可能です。

例えば、学生の点数や商品の価格など、同種のデータをまとめて扱う場面で配列は有効に機能します。

○C++における配列の基本的な宣言方法

C++における配列の宣言は、データ型に続いて角括弧([])内に要素数を指定することで行います。

例えば、10個の整数を格納する配列を宣言する場合、次のように記述します。

int array[10];

この宣言では、「int」は配列のデータ型を指し、「array」は配列の名前、「10」は配列が格納できる要素の数を意味します。

配列の各要素は、0から始まるインデックスを使ってアクセスでき、例えば「array[0]」は配列の最初の要素を指し、「array[9]」は最後の要素を指します。

●配列の詳細な使い方

C++で配列を使う際には、様々な操作が可能です。

配列の初期化、値の代入と取得、サイズの操作など、これらの基本的な使い方を理解することは、C++プログラミングの基礎を固める上で非常に重要です。

○サンプルコード1:配列の初期化

配列を宣言する際には、同時に初期値を設定することができます。

初期化を行うことで、配列の各要素に特定の値を設定することが可能になります。

例えば、5つの整数要素を持つ配列をすべて0で初期化するには以下のように書きます。

int array[5] = {0, 0, 0, 0, 0};

このコードでは、5つの要素を持つ整数型の配列「array」を宣言し、すべての要素を0で初期化しています。

配列の初期化は、プログラムの可読性を高め、バグを防ぐ上で重要です。

○サンプルコード2:配列への値の代入と取得

配列に値を代入し、取得する方法を見てみましょう。

配列の特定の位置に値を設定したり、特定の位置から値を取得することができます。

下記のコードでは、配列の第2要素に値を代入し、その値を取得して表示しています。

int array[5];
array[1] = 10; // 配列の第2要素に10を代入
cout << array[1]; // 配列の第2要素を表示

この例では、「array[1]」に10を代入しています。

C++では配列のインデックスは0から始まるため、「array[1]」は配列の第2要素を指します。

○サンプルコード3:配列のサイズ操作

C++では、配列のサイズ(要素の数)を動的に変更することはできませんが、配列のサイズを取得し、それを基に処理を行うことが重要です。

下記のコードでは、配列のサイズを取得し、そのサイズを利用して配列の要素を出力しています。

int array[5] = {1, 2, 3, 4, 5};
int size = sizeof(array) / sizeof(array[0]); // 配列のサイズを計算

for(int i = 0; i < size; i++) {
    cout << array[i] << " "; // 配列の各要素を出力
}

このコードでは、「sizeof(array) / sizeof(array[0])」を用いて配列のサイズを計算しています。

これにより、配列の要素数が変更されても、ループ処理で全要素を処理することができます。

●配列の応用例

C++における配列の応用は多岐にわたります。

多次元配列の使用から、データのソート、さらにはポインタとの関連性まで、配列を使った高度なテクニックを理解することは、プログラミングの幅を広げる上で非常に役立ちます。

○サンプルコード4:多次元配列の使用

多次元配列は、表や行列など、より複雑なデータ構造を表現するのに適しています。

例えば、3×3の整数型の2次元配列を定義するには、下記のように記述します。

int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

このコードは、3行3列の行列を表す2次元配列「matrix」を定義しています。

多次元配列は、画像処理、科学計算、ゲーム開発など、様々な場面で利用されます。

○サンプルコード5:配列を使ったデータのソート

配列に格納されたデータのソートは、データの整理や分析において重要な役割を果たします。

下記のコードは、単純なバブルソートアルゴリズムを使って配列を昇順にソートする方法を表しています。

int array[5] = {3, 1, 4, 1, 5};
int n = 5;

for (int i = 0; i < n-1; i++) {
    for (int j = 0; j < n-i-1; j++) {
        if (array[j] > array[j+1]) {
            // 要素を交換する
            int temp = array[j];
            array[j] = array[j+1];
            array[j+1] = temp;
        }
    }
}

このコードでは、配列の各要素を比較し、必要に応じて隣接する要素と交換しています。

ソートアルゴリズムは、データ処理の効率化に欠かせない要素です。

○サンプルコード6:配列とポインタの関係

C++における配列とポインタは密接な関係にあります。

配列名は、配列の最初の要素を指すポインタとして機能します。

下記のコードは、配列とポインタの関係を表しています。

int array[5] = {1, 2, 3, 4, 5};
int *ptr = array; // 配列の最初の要素を指すポインタを宣言

for (int i = 0; i < 5; i++) {
    cout << *(ptr + i) << " "; // ポインタを利用して配列の要素にアクセス
}

このコードでは、「ptr」ポインタを使って配列の各要素にアクセスしています。

ポインタを利用することで、配列の要素に対するより柔軟かつ効率的な操作が可能になります。

●配列を使用する際の注意点

C++で配列を使用する際には、いくつかの重要な注意点があります。

これらを理解し適切に対処することで、プログラムの信頼性と効率を高めることができます。

○配列の範囲外アクセス

配列の範囲外アクセスは、C++プログラミングにおいて最も一般的なエラーの一つです。

配列の範囲外にアクセスすると、予期せぬ動作やプログラムのクラッシュを引き起こす可能性があります。

下記のコードは、範囲外アクセスの一例を表しています。

int array[5] = {1, 2, 3, 4, 5};

for(int i = 0; i <= 5; i++) {
    cout << array[i] << " "; // 範囲外アクセスの危険性がある
}

この例では、「i <= 5」という条件により、配列の範囲を超えた6番目の要素にアクセスしようとしています。

これは未定義の挙動を引き起こす可能性があり、避けるべきです。

○メモリの動的確保と解放

C++では、配列のサイズを実行時に決定するために動的メモリ確保を使用することがあります。

しかし、動的に確保したメモリは、使用後に適切に解放する必要があります。

下記のコードは、動的メモリ確保と解放の例を表しています。

int* array = new int[5]; // 動的にメモリを確保

// 配列を使用する処理...

delete[] array; // 確保したメモリを解放

このコードでは、「new」演算子を使用して動的に配列を確保し、使用後に「delete[]」演算子でメモリを解放しています。

動的メモリの管理は慎重に行う必要があります。

メモリリークやダングリングポインタ(既に解放されたメモリを指すポインタ)のような問題を避けるために、確保したメモリは必ず解放することが重要です。

●配列のカスタマイズ方法

C++の配列をより効果的に使いこなすためには、カスタマイズが重要です。

カスタム関数やラムダ式を用いることで、配列操作の柔軟性と効率を高めることができます。

○サンプルコード7:カスタム関数で配列操作

カスタム関数を使って配列を操作することで、コードの再利用性と可読性を向上させることができます。

下記のコードは、配列の各要素を2倍にするカスタム関数の例です。

void doubleArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2; // 配列の要素を2倍にする
    }
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    doubleArray(array, 5); // 関数を呼び出して配列の要素を2倍にする

    // 結果の出力
    for (int i = 0; i < 5; i++) {
        cout << array[i] << " ";
    }
}

このコードでは、「doubleArray」関数を定義し、配列の各要素を2倍にしています。

関数を用いることで、同じ処理を異なる配列に対して容易に適用することができます。

○サンプルコード8:ラムダ式を使用した配列操作

ラムダ式を使用することで、配列操作をより簡潔に記述することが可能です。

下記のコードは、ラムダ式を用いて配列の各要素に特定の操作を適用する例です。

int main() {
    int array[5] = {1, 2, 3, 4, 5};

    // ラムダ式を使用して配列の各要素に操作を適用
    for_each(begin(array), end(array), [](int &n){ n *= 2; });

    // 結果の出力
    for (int n : array) {
        cout << n << " ";
    }
}

このコードでは、for_each関数とラムダ式を組み合わせて配列の各要素を2倍にしています。

ラムダ式は、短い一時的な関数を記述するのに非常に便利で、コードの可読性と効率を向上させることができます。

まとめ

この記事では、C++の配列の基本から応用まで、幅広い知識と技術を解説しました。

初心者から上級者まで、プログラミングのスキル向上に役立つ具体的なサンプルコードを提供し、実践的な使い方や注意点、カスタマイズ方法を詳しく紹介しました。

この知識を活用して、C++でのプログラミングをより効果的に行いましょう。

プログラミングにおいて、配列は基本的ながら強力なツールであり、その理解と適用が重要です。