C++標準ライブラリ---擬似関数
コンセプト
シミュレーション関数(functor)は、クラスの使用を関数のように見せることです.その実現はクラスの中でoperator()を実現し、このクラスは類似の関数の行為があり、模倣関数クラスである.
一部の機能のコードは、異なるメンバー関数で使用され、これらのコードを多重化したい場合があります.
1)共通の関数、はい、これは1つの解决方法ですが、関数が使ういくつかの変数は、共通のグローバル変数になる可能性があります.また、このようなコードを多重化するためには、1つの関数を立てるだけで、メンテナンスもよくありません.
2)関数を模倣し、単純なクラスを書き、クラスを維持するメンバー関数のほかにoperator()を実現するだけで、クラスがインスタンス化されると、使用するパラメータ以外の要素がクラスに転送されます.
一般的な関数を使用するには、次の手順に従います.
シミュレーション関数を使用するには、次の手順に従います.
行動が関数のようなものであれば、このオブジェクトは関数です.シミュレーション関数はこの意味ですが、STLではなぜ直接関数ではなくシミュレーション関数を使うのでしょうか.
まず、STLは独自のルールを持つフレームワークであり、関数ポインタはSTLの他のコンポーネント(アダプタ)と組み合わせることができず、より柔軟な変化を生み出します.
シミュレーション関数は、関数アダプタによって修飾され、互いに協力して全体を形成する能力があるべきである.シミュレーション関数をアタッチ可能にするには、独自の対応するカテゴリを定義する必要があります(反復器のカテゴリの役割は意味です).STLは1元と2元のシミュレーション関数のみを使用するため、2つのclass:unaru_を定義します.functionとbinary_function.この2つのクラスにはメンバーがなく、いくつかの型別定義しかありません.任意のシミュレーション関数は、個人のニーズに応じてclassの1つを継承することを選択すると、対応するカテゴリが自動的に所有され、アダプタ能力も自動的に所有されます.
次に、シミュレーション関数は、関数ポインタに対して独自の利点があります.
1、擬似関数は知能型関数である
スマートポインタの動作がポインタのように、ポインタと見なすことができます.しかし、スマートポインタは定義されたクラスオブジェクトであるため、ポインタ機能を備えながら他の能力もある.シミュレーション関数の能力はoperator()を超えることもできます.シミュレーション関数はメンバー関数とメンバー変数を持つことができるため、シミュレーション関数がステータスを持つことを意味します.もう1つの利点は、実行期間中に初期化できることです.
2、模関数はすべて自分の型别があります
これが汎用プログラミング作成シミュレーション関数です.
3、模関数は普通の関数より速い
templateの概念では、コンパイラでより詳細が決定されているため、通常、より良い最適化が可能である.
シミュレーション関数(functor)は、クラスの使用を関数のように見せることです.その実現はクラスの中でoperator()を実現し、このクラスは類似の関数の行為があり、模倣関数クラスである.
一部の機能のコードは、異なるメンバー関数で使用され、これらのコードを多重化したい場合があります.
1)共通の関数、はい、これは1つの解决方法ですが、関数が使ういくつかの変数は、共通のグローバル変数になる可能性があります.また、このようなコードを多重化するためには、1つの関数を立てるだけで、メンテナンスもよくありません.
2)関数を模倣し、単純なクラスを書き、クラスを維持するメンバー関数のほかにoperator()を実現するだけで、クラスがインスタンス化されると、使用するパラメータ以外の要素がクラスに転送されます.
一般的な関数を使用するには、次の手順に従います.
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
template<class T>
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
typename T::const_iterator pos;
cout<<optcstr;
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
}
int square(int value)
{
return value*value;
}
template<int theValue>
void add(int &elem)
{
elem+=theValue;
}
int main()
{
vector<int> coll1;
vector<int> coll2;
for(int i=1;i<=9;i++)
{
coll1.push_back(i);
}
PRINT_ELEMENTS(coll1,"initialized: ");
for_each(coll1.begin(),coll1.end(),add<10>);
PRINT_ELEMENTS(coll1,"after adding 10: ");
transform(coll1.begin(),coll1.end(),back_inserter(coll2),square);
PRINT_ELEMENTS(coll2,"squared: ");
system("pause");
return 0;
}
シミュレーション関数を使用するには、次の手順に従います.
//
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
template<class T>
inline void PRINT_ELEMENTS(const T& coll,const char * optcstr="")
{
typename T::const_iterator pos;
cout<<optcstr;
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<" ";
}
cout<<endl;
}
class AddValue
{
private:
int theValue;
public:
AddValue(int v):theValue(v) {}
void operator()(int &elem) const
{
elem+=theValue;
}
};
int main()
{
list<int> coll;
for(int i=1;i<=9;i++)
{
coll.push_back(i);
}
PRINT_ELEMENTS(coll,"initialized: ");
for_each(coll.begin(),coll.end(),AddValue(10));
PRINT_ELEMENTS(coll,"after adding 10: ");
for_each(coll.begin(),coll.end(),AddValue(*coll.begin()));
PRINT_ELEMENTS(coll,"after adding first element: ");
system("pause");
return 0;
}
行動が関数のようなものであれば、このオブジェクトは関数です.シミュレーション関数はこの意味ですが、STLではなぜ直接関数ではなくシミュレーション関数を使うのでしょうか.
まず、STLは独自のルールを持つフレームワークであり、関数ポインタはSTLの他のコンポーネント(アダプタ)と組み合わせることができず、より柔軟な変化を生み出します.
シミュレーション関数は、関数アダプタによって修飾され、互いに協力して全体を形成する能力があるべきである.シミュレーション関数をアタッチ可能にするには、独自の対応するカテゴリを定義する必要があります(反復器のカテゴリの役割は意味です).STLは1元と2元のシミュレーション関数のみを使用するため、2つのclass:unaru_を定義します.functionとbinary_function.この2つのクラスにはメンバーがなく、いくつかの型別定義しかありません.任意のシミュレーション関数は、個人のニーズに応じてclassの1つを継承することを選択すると、対応するカテゴリが自動的に所有され、アダプタ能力も自動的に所有されます.
次に、シミュレーション関数は、関数ポインタに対して独自の利点があります.
1、擬似関数は知能型関数である
スマートポインタの動作がポインタのように、ポインタと見なすことができます.しかし、スマートポインタは定義されたクラスオブジェクトであるため、ポインタ機能を備えながら他の能力もある.シミュレーション関数の能力はoperator()を超えることもできます.シミュレーション関数はメンバー関数とメンバー変数を持つことができるため、シミュレーション関数がステータスを持つことを意味します.もう1つの利点は、実行期間中に初期化できることです.
2、模関数はすべて自分の型别があります
これが汎用プログラミング作成シミュレーション関数です.
3、模関数は普通の関数より速い
templateの概念では、コンパイラでより詳細が決定されているため、通常、より良い最適化が可能である.