C++ STLの配列アルゴリズム徹底解説!all_of・any_of・none_of・copy_n・iotaの使い方
C++11で追加されたSTLの配列アルゴリズムとは
C++11以降、STL(標準テンプレートライブラリ)には配列やコンテナを効率的に扱うためのアルゴリズム関数が多数追加されました。これらの関数は主に <algorithm> ヘッダーに定義されており、ループ処理を自前で書く必要がなくなるため、コードの可読性と保守性が大きく向上します。
ここでは、実践で特に役立つ5つの関数をサンプルコードとともに解説します。
1. all_of():すべての要素が条件を満たすか判定する
all_of() は、コンテナ内のすべての要素が指定した条件を満たす場合に true を返す関数です。たとえば「配列内の値がすべて偶数かどうか」を確認したい場合に使用します。
サンプルコード
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10};
int n = sizeof(arr) / sizeof(arr[0]);
if (all_of(arr, arr + n, [](int x) { return x % 2 == 0; })) {
cout << "All are even";
} else {
cout << "All are not even";
}
}
出力結果
All are even
2. any_of():少なくとも1つの要素が条件を満たすか判定する
any_of() は、コンテナ内の少なくとも1つの要素が条件を満たしていれば true を返します。「奇数の要素が1つでも存在するか」といった判定に便利です。
サンプルコード
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr) / sizeof(arr[0]);
if (any_of(arr, arr + n, [](int x) { return x % 2 == 1; })) {
cout << "At least one element is odd";
} else {
cout << "No odd elements are found";
}
}
出力結果
At least one element is odd
3. none_of():どの要素も条件を満たさないか判定する
none_of() は、コンテナ内のどの要素も指定した条件を満たさない場合に true を返します。たとえば「負の値が1つも含まれていないこと」を保証したい場面で活用できます。
サンプルコード
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr) / sizeof(arr[0]);
if (none_of(arr, arr + n, [](int x) { return x < 0; })) {
cout << "All elements are positive";
} else {
cout << "Some elements are negative";
}
}
出力結果
All elements are positive
※元のコードでは x < 0 == 1 という紛らわしい記述がありましたが、意図しない挙動を招く恐れがあるため x < 0 に修正しています。
4. copy_n():指定した個数だけ要素をコピーする
copy_n() は、ある配列から別の配列へ指定した個数分の要素をコピーする関数です。引数として「コピー元の先頭」「コピーする個数」「コピー先の先頭」の3つを指定します。
サンプルコード
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[] = {2, 4, 6, 8, 10, 5, 62};
int n = sizeof(arr) / sizeof(arr[0]);
int arr2[n];
copy_n(arr, n, arr2);
for (int i = 0; i < n; i++) {
cout << arr2[i] << " ";
}
}
出力結果
2 4 6 8 10 5 62
5. iota():連続する値を配列に代入する
iota() は、配列に対して開始値から1ずつ増加する連続した値を順番に代入する関数です。この関数は <numeric> ヘッダーに定義されており、「配列の先頭」「終端」「開始値」の3つの引数を取ります。
サンプルコード
#include <iostream>
#include <numeric>
using namespace std;
int main() {
int n = 10;
int arr[n];
iota(arr, arr + n, 10);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
出力結果
10 11 12 13 14 15 16 17 18 19
まとめ
C++11で導入されたこれらのアルゴリズム関数を使いこなせば、従来はforループで複数行書いていた処理を1行で簡潔に表現できます。条件判定には all_of()・any_of()・none_of()、要素のコピーには copy_n()、連番の生成には iota() と、用途に応じて使い分けることで、より安全で読みやすいC++コードを実現しましょう。
-
C++で2次元配列を関数に渡す方法
C++では、配列をそのまま関数の引数として渡すことができます。本記事では、2次元配列を関数に引き渡して、その要素をすべて表示するプログラムを紹介します。 アルゴリズム Begin 2次元配列 n[][] を関数 show() に渡す。 show() 関数内で、二重の for ループ(ネストされたループ)を使って配列 n の全要素を走査する。 End サンプルコード #include <iostream> using namespace std; void show(int n[4][3]); int main() { int n[4][3] = {
-
【C++入門】配列を関数に渡す3つの方法をわかりやすく解説
C++では、配列全体をそのまま関数の引数として渡すことはできません。しかし、インデックスを付けずに配列名を指定することで、配列へのポインタを渡すことができます。これは「配列名は先頭要素へのポインタに読み替えられる(配列の減衰)」というC++の仕組みによるものです。1次元配列を関数の引数として渡したい場合は、以下の3つのいずれかの方法で関数の仮引数を宣言します。どの方法でも、コンパイラに対して「整数型のポインタを受け取る」という情報が伝わるため、動作結果はすべて同じになります。配列を関数に渡す3つの宣言方法1. ポインタとして仮引数を宣言するvoid myFunction(int *param)