C++のファンクター(関数オブジェクト)とは?基本と使い方を解説
C++におけるファンクター(関数オブジェクト)とは、クラスのインスタンスであるオブジェクトを、あたかも通常の関数のように呼び出せるようにする仕組みです。これは、クラス内でoperator()(関数呼び出し演算子)をオーバーロードすることで実現されます。
ファンクターを使うと、引数を1つ受け取る関数と同じように、一連のデータに対して何らかの処理を実行できます。標準ライブラリの<algorithm>ヘッダにある各種アルゴリズム関数と組み合わせることで、柔軟で再利用性の高いコードを書くことが可能になります。
サンプルコード
以下は、1つの引数を受け取ってその二乗を返す関数を、関数オブジェクトとしてstd::transformに渡し、配列内のすべての要素を二乗する例です。
#include <iostream>
#include <algorithm>
using namespace std;
int square(int x) {
return x * x; // x の二乗を返す
}
int main() {
int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
transform(data, data + 10, data, square);
for (int i = 0; i < 10; i++)
cout << data[i] << endl;
}
実行結果
0 1 4 9 16 25 36 49 64 81
ファンクターの利点
単なる関数や関数ポインタと比較して、ファンクターには次のようなメリットがあります。
- 状態を保持できる:メンバ変数を利用することで、呼び出し間で状態を維持できます。これにより、カウンタや設定値を持つ処理を簡潔に実装できます。
- 最適化されやすい:コンパイラが呼び出しをインライン化しやすいため、パフォーマンスが向上する場合があります。
- 型安全な汎用プログラミングが可能:テンプレートと組み合わせることで、型安全かつ柔軟な設計が実現できます。
このように、ファンクターはC++において関数の振る舞いをオブジェクトとして扱うための強力な手段であり、STLアルゴリズムとの相性も抜群です。ぜひ実際のコードで活用してみてください。
-
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)