STLのファンクタ(関数オブジェクト)

##定義

  • ファンクタ(ファンクタ):オブジェクト機能特性を有します。
  • 新しいのためのC ++ファンクタ名で関数オブジェクト(関数オブジェクト)。関数のようなファンクタクラスオブジェクトは、コールファンクタクラスオブジェクト、実際の通話が過負荷になっているクラスのファンクタ演算子()関数と呼ばれています。主な目的ファンクタは、STLアルゴリズムです。

一の実施頻繁に使用する機能、デフォルトの処理方法:アルゴリズム##のアプリケーションは、一般に、STLに2つのバージョンが定義されています。汎化能力を提供するための別のアプローチは、ユーザが比較アルゴリズムまたはコンテナ内の要素のように適用される指定された「動作」アルゴリズムの条件を指定することができます。ここでは、テンプレートパラメータのアルゴリズムの比較基準があります。デフォルトのバージョン:このような提供STLの検索アルゴリズムの2つのバージョンのように:

template <class _ForwardIter1, class _ForwardIter2>
_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
                     _ForwardIter2 __first2, _ForwardIter2 __last2) 

比較方法のバージョンを指定します。

template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
                     _ForwardIter2 __first2, _ForwardIter2 __last2,
                     _BinaryPred  __predicate) 

あなたは要素を指定された比較基準のために、テンプレートパラメータの指定以上の述語テンプレートの比較方法のバージョンは_BinaryPred、見ることができます。そして、デフォルトのバージョンが使用する=演算子は、等しいか否かを判断します。

操作を指定するには多くの方法があります。

  • 一般的には、機能によって定義されたアルゴリズムのパラメータとして関数ポインタに渡されます。
  • クラスも定義され、クラスにそのようなクラスのファンクタクラスとして演算子()関数をオーバーロードすることができます。
  • ラムダは匿名関数(C ++ 11以降)を使用します。
  • 一般的な多型関数ラッパーのstd ::機能(C ++以降11)。二人はファンクタを使用しています。
#include<iostream>
#include<functional>

using namespace std;

int main(){
    greater<int> ig;
    cout<<boolalpha<<ig(3,5)<<endl;                //a
    cout<<boolalpha<<greater<int>()(5,3)<<endl;    //b

	return 0;
}

行がファンクタオブジェクトによって追加された後()のパラメータ、コールファンクタオーバーロード演算子()関数は、関数で定義されています。BのFunctorクラスとの接触によって行()、コンストラクタファンクタクラスを呼び出し、一時的な関数オブジェクトを生成し、一時的なオブジェクト呼び出し演算子()。

プログラムをコンパイルして実行し、結果は次のとおりです。

false
true

STLファンクタがキー機能ヘッダファイルに定義され、それは、次のカテゴリに分けられます。

グラフLRファンクタ--- ---数子機能オペランドオペランド単項演算--- --- --- Oネゲート1元2元2元機能--- --- ...算術演算算術演算の機能---関係関係機能---論理演算する論理演算---プラス算術演算---マイナス算術演算---乗算算術演算---分割算術演算---モジュラス算術演算---ネゲート関係関係--- equal_to関係論理関係の関係---大きい関係の関係--- greater_equalで関係の関係---あまり関係の関係--- less_equalロジックnot_equal_to関係--- --- logical_andロジック論理--- logical_orロジック論理--- logical_not

おすすめ

転載: www.cnblogs.com/SupremeGIS-Developer/p/11962537.html