c++內建函式物件

バカなの發表於2024-03-13

概念:c++STL中內建了一些函式物件

分類:

  • 算術仿函式
  • 關係仿函式
  • 邏輯仿函式

用法:

  • 這些仿函式所產生的物件,用法和一般函式完全相同
  • 使用內建函式物件,需要使用標頭檔案#include<functional>

1.算術仿函式

功能描述:

  • 實現四則運算
  • 其中negate是一元運算,其他都是二元運算

仿函式原型:

  • template<class T> T plus <T> //加法仿函式
  • template<class T> T minus<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> //取反仿函式

例項程式碼:

#include <iostream>

using namespace std;

#include <functional>

void test01() {
    //negate一元仿函式,取反
    negate<int> v;
    cout << v(50) << endl;
}

void test02() {
    //plus二元仿函式,加法
    plus<int> v;
    cout << v(10, 20) << endl;
}

int main() {
    //結果:-50 30
    test01();
    test02();
}

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> gretaer_equal<T> //大於等於
  • template<class T> less<T> //小於
  • template<class T> less_equal<T> //小於等於

例項程式碼:

#include <iostream>
#include <vector>

using namespace std;

#include <functional>

//自定義仿函式
class myCompare {
public:
    bool operator()(int v1, int v2) {
        return v1 > v2;
    }
};

void printVector(vector<int> &v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<int> v;
    v.push_back(40);
    v.push_back(20);
    v.push_back(10);
    v.push_back(30);
    v.push_back(50);

    printVector(v);

    //升序排列
    sort(v.begin(), v.end());
    printVector(v);

    //降序排列,使用自定義的仿函式
    sort(v.begin(), v.end(), myCompare());
    printVector(v);

    //降序排列,使用內建的仿函式
    sort(v.begin(), v.end(), greater<int>());
    printVector(v);

}

int main() {
    test01();
}

結果:

40 20 10 30 50
10 20 30 40 50
50 40 30 20 10
50 40 30 20 10

3.邏輯仿函式

功能描述:

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

例項程式碼:

#include <iostream>
#include <vector>

using namespace std;

#include <functional>

void printVector(vector<bool> &v) {
    for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<bool> v;
    v.push_back(true);
    v.push_back(false);
    v.push_back(true);
    v.push_back(false);

    printVector(v);

    //使用邏輯非,將容器v搬運到容器v2中,並執行取反操作
    vector<bool> v2;
    v2.resize(v.size());
    transform(v.begin(),v.end(),v2.begin(),logical_not<bool>());

    printVector(v2);

}

int main() {
    test01();
}

結果:

1 0 1 0
0 1 0 1

相關文章