1. 程式人生 > >C++進階STL-函式物件

C++進階STL-函式物件

函式物件的概念

  • 過載  ()操作符  的類,它的物件叫做函式物件,即它是 類似於函式的 物件(它可以向函式一樣呼叫),也叫作仿函式。
    注意:函式物件(仿函式)是一個類,不是一個函式。

  • 過載操作符()有一個引數,稱為一元仿函式,有兩個引數,就叫二元仿函式。如果返回值是bool型別的函式物件或者普通函式,有一個引數叫做一元謂詞

  • 函式物件做引數和返回值

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Print { int num; // 儲存執行的次數 Print() { num = 0; } void operator()(int val) { cout << val << endl; num++; } }; int main() { Print myprint; vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); Print myprint2=for_each(v1.begin
(), v1.end(), myprint); //遍歷演算法,函式物件作為引數,返回值也是函式物件 cout << myprint2.num << endl; //打印出呼叫的次數,結果num=4 return 0; }

內建的函式物件 include<functional>

  • STL內建了一些函式物件,分為:
    算術類函式物件
    關係運算類
    邏輯運算類

用這些類的物件當做函式使用,用法與函式完全相同


1. 六個算術類 的函式物件,negate是一元,其他都是二元

  • template <class T>   T plus<T>  //加法的仿函式
  • template <class T>  T minute<T>  //減法的仿函式
  • template <class T>   T multiplies<T>  //乘法的仿函式
  • template <class T>   T divides<T>  //除法的仿函式
  • template <class T>   T modulus<T>  //取模(%)的仿函式
  • template <class T>   T negate<T>  //取反的仿函式
	plus <int> myplus;
	cout << myplus(20, 10) << endl;
//輸出結果: 30

2. 六個關係運算類 的函式物件,都是二元運算

  • template<class T>  bool  equal_to <T>  //等於
  • template<class T>  bool  not_equal_to <T>  //不等於
  • template<class T>  bool  greater <T>  //大於
  • template<class T>  bool  greater_equal<T>  //大於等於
  • template<class T>  bool  less <T>  //小於
  • template<class T>  bool  less_equal <T>  //小於等於

3. 三個邏輯運算類 的函式物件,not是一元,其他都是二元運算

  • template<class T>  bool  logical_and <T>  //邏輯與
  • template<class T>  bool  logical_or <T>  //邏輯或
  • template<class T>  bool  logical_not <T>  //邏輯非