[C++] std::arrayの引数について解説

std::arrayは、C++標準ライブラリで提供される固定サイズの配列を扱うためのコンテナです。

テンプレートとして、要素の型と配列のサイズを引数に取ります。例えば、std::arrayは5つの整数を格納する配列を定義します。

サイズはコンパイル時に決定され、変更できません。std::arrayは、通常の配列と異なり、サイズ情報を保持しているため、範囲外アクセスのチェックが容易です。

また、STLの他のコンテナと同様に、begin()end()といったメンバ関数を利用できます。

この記事でわかること
  • std::arrayの宣言と初期化方法
  • 関数への引数としての利用方法
  • 要素へのアクセスや操作の方法
  • ソートや検索、データ集計といった応用例

目次から探す

std::arrayとは

std::arrayは、C++の標準ライブラリで提供される固定サイズの配列を扱うためのコンテナです。

C++11で導入され、従来のCスタイルの配列に比べて、より安全で使いやすい特徴を持っています。

std::arrayは、テンプレートクラスとして定義されており、要素の型と配列のサイズをテンプレートパラメータとして指定します。

これにより、コンパイル時にサイズが決定され、サイズの変更はできませんが、要素へのアクセスや操作が容易になります。

また、std::arrayはSTL(Standard Template Library)の一部であるため、他のSTLコンテナと同様に、イテレーションやアルゴリズムの適用が可能です。

これにより、コードの可読性と保守性が向上します。

std::arrayの宣言と初期化

std::arrayの使用において、宣言と初期化は基本的なステップです。

ここでは、std::arrayの宣言方法と初期化方法について詳しく解説します。

std::arrayの宣言方法

std::arrayはテンプレートクラスであり、要素の型と配列のサイズを指定して宣言します。

以下に基本的な宣言方法を示します。

#include <array>
// int型の要素を持つサイズ5のstd::arrayを宣言
std::array<int, 5> myArray;

この例では、int型の要素を持つサイズ5のstd::arrayを宣言しています。

std::arrayは固定サイズであるため、サイズはコンパイル時に決定されます。

std::arrayの初期化方法

std::arrayの初期化にはいくつかの方法があります。

ここでは、デフォルト初期化、値を指定した初期化、コピー初期化について説明します。

デフォルト初期化

デフォルト初期化では、std::arrayの要素はデフォルトコンストラクタによって初期化されます。

プリミティブ型の場合、未定義の値が設定されることがあります。

#include <array>
// デフォルト初期化
std::array<int, 5> myArray; // 要素は未定義の値

値を指定した初期化

値を指定して初期化する方法では、波括弧 {} を使用して要素を指定します。

#include <array>
// 値を指定した初期化
std::array<int, 5> myArray = {1, 2, 3, 4, 5};

この例では、myArrayの各要素に1から5までの値が設定されます。

コピー初期化

コピー初期化では、既存のstd::arrayを使って新しいstd::arrayを初期化します。

#include <array>
// コピー初期化
std::array<int, 5> originalArray = {1, 2, 3, 4, 5};
std::array<int, 5> copiedArray = originalArray;

この例では、originalArrayの内容がcopiedArrayにコピーされます。

コピー初期化は、同じ型とサイズのstd::array間でのみ可能です。

std::arrayの引数としての利用

std::arrayは関数の引数として利用することができます。

ここでは、std::arrayを関数に渡す方法と、std::arrayを返す関数の作成方法について解説します。

関数にstd::arrayを渡す方法

std::arrayを関数に渡す方法には、値渡し、参照渡し、const参照渡しの3つがあります。

それぞれの方法について説明します。

値渡し

値渡しでは、std::arrayのコピーが関数に渡されます。

関数内での変更は元の配列に影響を与えません。

#include <array>
#include <iostream>
// 値渡しの例
void printArrayByValue(std::array<int, 3> arr) {
    for (int i : arr) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}
int main() {
    std::array<int, 3> myArray = {1, 2, 3};
    printArrayByValue(myArray);
    return 0;
}

この例では、printArrayByValue関数myArrayのコピーが渡され、関数内での変更は元のmyArrayに影響を与えません。

参照渡し

参照渡しでは、std::arrayの参照が関数に渡されます。

関数内での変更は元の配列に影響を与えます。

#include <array>
#include <iostream>
// 参照渡しの例
void modifyArrayByReference(std::array<int, 3>& arr) {
    arr[0] = 10; // 最初の要素を変更
}
int main() {
    std::array<int, 3> myArray = {1, 2, 3};
    modifyArrayByReference(myArray);
    std::cout << myArray[0] << std::endl; // 出力: 10
    return 0;
}

この例では、modifyArrayByReference関数内でmyArrayの最初の要素が変更され、元の配列に影響を与えます。

const参照渡し

const参照渡しでは、std::arrayの参照が関数に渡されますが、関数内での変更は許可されません。

読み取り専用の操作に適しています。

#include <array>
#include <iostream>
// const参照渡しの例
void printArrayByConstReference(const std::array<int, 3>& arr) {
    for (int i : arr) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}
int main() {
    std::array<int, 3> myArray = {1, 2, 3};
    printArrayByConstReference(myArray);
    return 0;
}

この例では、printArrayByConstReference関数myArrayを読み取るだけで、変更はできません。

std::arrayを返す関数の作成

関数からstd::arrayを返すことも可能です。

関数の戻り値としてstd::arrayを指定します。

#include <array>
// std::arrayを返す関数の例
std::array<int, 3> createArray() {
    return {4, 5, 6};
}
int main() {
    std::array<int, 3> newArray = createArray();
    for (int i : newArray) {
        std::cout << i << " ";
    }
    std::cout << std::endl; // 出力: 4 5 6
    return 0;
}

この例では、createArray関数std::arrayを生成して返します。

関数から返されたstd::arrayは、呼び出し元で受け取ることができます。

std::arrayの操作

std::arrayは、要素へのアクセスや操作が簡単に行えるように設計されています。

ここでは、std::arrayの基本的な操作について解説します。

要素へのアクセス

std::arrayの要素にアクセスする方法には、インデックスによるアクセスとat()メソッドによるアクセスがあります。

インデックスによるアクセス

インデックスを使用して、std::arrayの要素に直接アクセスできます。

インデックスは0から始まります。

#include <array>
#include <iostream>
int main() {
    std::array<int, 3> myArray = {10, 20, 30};
    std::cout << myArray[0] << std::endl; // 出力: 10
    return 0;
}

この例では、インデックス0を使用して最初の要素にアクセスしています。

at()メソッドによるアクセス

at()メソッドを使用すると、範囲外アクセス時に例外をスローするため、安全に要素にアクセスできます。

#include <array>
#include <iostream>
int main() {
    std::array<int, 3> myArray = {10, 20, 30};
    try {
        std::cout << myArray.at(1) << std::endl; // 出力: 20
    } catch (const std::out_of_range& e) {
        std::cerr << "範囲外アクセス: " << e.what() << std::endl;
    }
    return 0;
}

この例では、at()メソッドを使用して2番目の要素にアクセスしています。

範囲外アクセスが発生した場合、std::out_of_range例外がスローされます。

サイズの取得

std::arrayのサイズはsize()メソッドを使用して取得できます。

#include <array>
#include <iostream>
int main() {
    std::array<int, 3> myArray = {10, 20, 30};
    std::cout << "サイズ: " << myArray.size() << std::endl; // 出力: サイズ: 3
    return 0;
}

この例では、size()メソッドを使用してmyArrayのサイズを取得しています。

要素の変更

std::arrayの要素は、インデックスを使用して変更することができます。

#include <array>
#include <iostream>
int main() {
    std::array<int, 3> myArray = {10, 20, 30};
    myArray[1] = 50; // 2番目の要素を変更
    std::cout << myArray[1] << std::endl; // 出力: 50
    return 0;
}

この例では、インデックス1を使用して2番目の要素を変更しています。

イテレーション

std::arrayはSTLコンテナであるため、範囲ベースのforループやイテレータを使用して要素を反復処理できます。

#include <array>
#include <iostream>
int main() {
    std::array<int, 3> myArray = {10, 20, 30};
    // 範囲ベースのforループ
    for (int value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl; // 出力: 10 20 30
    // イテレータを使用したループ
    for (auto it = myArray.begin(); it != myArray.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl; // 出力: 10 20 30
    return 0;
}

この例では、範囲ベースのforループとイテレータを使用してmyArrayの要素を反復処理しています。

どちらの方法も、std::arrayの全要素にアクセスするのに便利です。

std::arrayの応用例

std::arrayは、固定サイズの配列を扱うための便利なコンテナであり、さまざまな応用が可能です。

ここでは、std::arrayを用いたソート、検索、データ集計の例を紹介します。

std::arrayを用いたソート

std::arrayの要素をソートするには、std::sort関数を使用します。

std::sortは、<algorithm>ヘッダに含まれており、イテレータを使用して範囲を指定します。

#include <array>
#include <algorithm>
#include <iostream>
int main() {
    std::array<int, 5> myArray = {5, 2, 9, 1, 3};
    // std::sortを使用してソート
    std::sort(myArray.begin(), myArray.end());
    // ソート結果を表示
    for (int value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl; // 出力: 1 2 3 5 9
    return 0;
}

この例では、std::sortを使用してmyArrayの要素を昇順にソートしています。

std::arrayを用いた検索

std::array内の要素を検索するには、std::find関数を使用します。

std::findは、指定した値を持つ要素を検索し、見つかった場合はそのイテレータを返します。

#include <array>
#include <algorithm>
#include <iostream>
int main() {
    std::array<int, 5> myArray = {5, 2, 9, 1, 3};
    // std::findを使用して検索
    auto it = std::find(myArray.begin(), myArray.end(), 9);
    if (it != myArray.end()) {
        std::cout << "見つかりました: " << *it << std::endl; // 出力: 見つかりました: 9
    } else {
        std::cout << "見つかりませんでした" << std::endl;
    }
    return 0;
}

この例では、std::findを使用してmyArray内の値9を検索し、見つかった場合はその値を表示しています。

std::arrayを用いたデータ集計

std::arrayの要素を集計するには、std::accumulate関数を使用します。

std::accumulateは、指定した範囲の要素を累積して合計を計算します。

#include <array>
#include <numeric>
#include <iostream>
int main() {
    std::array<int, 5> myArray = {5, 2, 9, 1, 3};
    // std::accumulateを使用して合計を計算
    int sum = std::accumulate(myArray.begin(), myArray.end(), 0);
    std::cout << "合計: " << sum << std::endl; // 出力: 合計: 20
    return 0;
}

この例では、std::accumulateを使用してmyArrayの要素の合計を計算しています。

初期値として0を指定し、各要素を累積して合計を求めます。

よくある質問

std::arrayとstd::vectorの違いは何ですか?

std::arraystd::vectorはどちらもC++の標準ライブラリで提供されるコンテナですが、いくつかの重要な違いがあります。

  • サイズの固定性: std::arrayは固定サイズの配列であり、サイズはコンパイル時に決定されます。

一方、std::vectorは動的配列であり、実行時にサイズを変更できます。

  • メモリ管理: std::arrayはスタック上に配置されることが多く、メモリ管理が簡単です。

std::vectorはヒープ上に配置され、動的にメモリを確保します。

  • パフォーマンス: std::arrayはサイズが固定であるため、メモリの再割り当てが不要で、パフォーマンスが安定しています。

std::vectorはサイズ変更時にメモリの再割り当てが発生することがあります。

std::arrayのサイズを動的に変更できますか?

std::arrayのサイズは固定であり、動的に変更することはできません。

サイズはテンプレートパラメータとして指定され、コンパイル時に決定されます。

サイズを変更したい場合は、std::vectorを使用することを検討してください。

std::vectorは動的にサイズを変更できるため、可変長の配列が必要な場合に適しています。

std::arrayを使うべき場面はどんなときですか?

std::arrayは、以下のような場面で使用するのが適しています。

  • 固定サイズのデータ: 配列のサイズが固定であり、変更する必要がない場合にstd::arrayを使用すると、コードがシンプルで効率的になります。
  • パフォーマンスが重要な場合: std::arrayはメモリの再割り当てが不要で、スタック上に配置されるため、パフォーマンスが重要な場面で有利です。
  • 安全性の向上: std::arrayは範囲外アクセス時に例外をスローするat()メソッドを提供しており、Cスタイルの配列に比べて安全性が向上します。

これらの特性を考慮して、std::arrayを使用するかどうかを判断してください。

まとめ

この記事では、C++のstd::arrayについて、その基本的な宣言方法や初期化方法、関数への引数としての利用法、そして応用例としてのソートや検索、データ集計までを詳しく解説しました。

std::arrayは固定サイズの配列を安全かつ効率的に扱うための便利なコンテナであり、特にサイズが固定されている場面での使用に適しています。

これを機に、std::arrayを活用して、より安全で効率的なC++プログラミングに挑戦してみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す