[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
を指定し、各要素を累積して合計を求めます。
よくある質問
まとめ
この記事では、C++のstd::array
について、その基本的な宣言方法や初期化方法、関数への引数としての利用法、そして応用例としてのソートや検索、データ集計までを詳しく解説しました。
std::array
は固定サイズの配列を安全かつ効率的に扱うための便利なコンテナであり、特にサイズが固定されている場面での使用に適しています。
これを機に、std::array
を活用して、より安全で効率的なC++プログラミングに挑戦してみてはいかがでしょうか。