c++におけるSTLの一般的なアルゴリズム--1(関数オブジェクト,述語,組み込み関数オブジェクト)

4778 ワード

関数オブジェクト
リロード関数呼び出しオペレータのクラスです.オブジェクトは関数オブジェクト(function object)と呼ばれます.つまり、動作が関数に似ているオブジェクトであり、シミュレーション関数(functor)とも呼ばれます.実際には「()」オペレータをリロードし、クラスオブジェクトが関数のように注意を呼び出すことができます.
  • 関数オブジェクト(擬似関数)はクラスであり、関数
  • ではありません.
  • 関数オブジェクト(擬似関数)リロード()オペレータは、クラスにリロードされたoperator()があり、リロードされたoperator()がパラメータを取得する必要があると仮定し、このクラスを**「一元擬似関数**」と呼び、リロードされたoperator()が2つのパラメータを取得する必要がある場合、このクラスを「」と呼びます.二元シミュレーション関数」関数オブジェクトの役割は主に何ですか?STLが提供するアルゴリズムには2つのバージョンがあることが多い.そのうちの1つは最も一般的な演算を示し、もう1つのバージョンは、ユーザーがtemplateパラメータの形式で取るべきポリシー
  • を指定することを可能にする.
    関数オブジェクト呼び出し
    #include
    using namespace std;
    
    class Myprint
    {
    public:
    	void operator ()(int num)
    	{
    		cout << "num" << num << endl;
    		count++;
    	}
    	int count = 0;
    };
    
    void MyPrint2(int num)
    {
    	cout << "num" << num << endl;
    }
    
    
    void test01()
    {
    	//MyPrint    ,     
    	Myprint myPrint;
    	myPrint(111); //     
    
    	//MyPrint2(111);//    
    
    	Myprint()(1000);//      
    }
    

    関数オブジェクトは通常の関数の概念を超えており、状態を保存できます.
    //         ,       ,          
        void  test02()
        {
        	Myprint myPrint;
        	myPrint(111);
        	myPrint(111);
        	myPrint(111);
        	myPrint(111);
        
        	cout << "myPrint    :" << myPrint.count << endl;
        }
    

    パラメータとして関数オブジェクトを渡す
    void doPrint(Myprint print, int num)
    {
    	print(num);
    }
    void test03()
    {
    	doPrint(Myprint(), 20);
    
    	
    }
    

    まとめ
  • 関数オブジェクトは、通常、コンストラクション関数およびコンストラクション関数を定義しないため、コンストラクションおよびコンストラクション時に問題は発生せず、関数呼び出しの実行時問題
  • を回避する.
  • 関数オブジェクトは通常の関数の概念を超え、関数オブジェクトは独自の状態
  • を持つことができる.
  • 関数オブジェクトは関数をインラインすることができ、性能がよく、関数ポインタでは
  • はほとんど不可能である.
  • テンプレート関数オブジェクトは、関数オブジェクトに汎用性をもたらすことも利点の1つである
  • である.
    述語
    述語とは、通常の関数またはリロードされたoperator()の戻り値がboolタイプの関数オブジェクト(擬似関数)であることを意味します.operatorが1つのパラメータを受け入れる場合を1元述語と呼び、2つのパラメータを受け入れる場合を2元述語と呼び、述語は1つの判断式とすることができる
    一元述語
    #include
    
    using namespace std;
    #include
    #include
    
    
    class CreateThen20
    {
    public:
    	bool operator()(int val)
    	{
    		return val > 20;
    	}
    };
    
    
    
    //    
    void test01()
    {
    	vectorv;
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(30);
    	v.push_back(40);
    	v.push_back(50);
    
    	//       20   
    	//          ,    
    	vector::iterator pos= find_if(v.begin(), v.end(),CreateThen20());
    	if (pos != v.end())
    	{
    		cout << "    20    :" << *pos << endl;
    	}
    }
    

    にげん述語
    class MyCompare
    {
    public:
    	bool operator()(int v1, int v2)
    	{
    		return v1 > v2;
    	}
    };
    
    
    void test02()
    {
    	vectorv;
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(30);
    	v.push_back(40);
    	v.push_back(50);
    
    	sort(v.begin(), v.end(), MyCompare());
    
    
    	//      lambda    []   ()  {}         [](int val){cout << val << " "; }
    	for_each(v.begin(), v.end(), [](int val){cout << val << " "; });
    }
    
    
    
    
    int main()
    {
    	//test01();
    	test02();
    	system("pause");
    	return 0;
    }
    

    組み込み関数オブジェクト
    STL内に関数オブジェクトを作成します.分類:算術クラス関数オブジェクト、関係演算クラス関数オブジェクト、論理演算クラスシミュレーション関数.これらの擬似関数によって生成されるオブジェクトは、一般的な関数と全く同じ使い方をしています.もちろん、関数の機能を履行するために無名の一時オブジェクトを生成することもできます.組み込み関数オブジェクトを使用するには、ヘッダファイル#includeを参照する必要があります.
    算術関数オブジェクト
  • 加算:plus plusstringAdd;sres=stringAdd(sva1,sva2);
  • 減算:minus
  • 乗算:multiplies
  • 除算divides
  • 余剰を求める:modulus
  • 取反:negate
  • リレーショナル関数オブジェクト
  • はequalに等しいto equal_tostringEqual; sres=stringEqual(sval1,sval2);
  • がnotに等しくないequal_to
  • greater
  • より大きい
  • がgreater以上equal
  • less
  • 未満
  • less以下equal

  • 論理関数オブジェクト
  • 論理とlogical_and logical_andindAnd; ires=intAnd(ival1,ival2); dres=BinaryFunc(logical_and(),dval1,dval2);
  • 論理またはlogical_or
  • 論理非logical_not logical_notIntNot; Ires=IntNot(ival1); Dres=UnaryFunc(logical_not,dval1);
    #include
    
    using namespace std;
    //          
    #include
    #include
    #include
    
    void test01()
    {
    	//templateT negate//     
    	negaten;
    	cout << n(10) << endl;
    
    	//   template T plus//     
    	plusp;
    
    	cout << p(1, 1) << endl;
    }
    
    //template bool greater     
    void test02()
    {
    	vectorv;
    
    	v.push_back(10);
    	v.push_back(30);
    	v.push_back(50);
    	v.push_back(20);
    	v.push_back(40);
    
    	sort(v.begin(), v.end(), greater());
    
    	for_each(v.begin(), v.end(), [](int val){cout << val << " "; });
    
    }
    
    
    int main()
    {
    	//test01();
    	test02();
    	system("pause");
    	return 0;
    }