c++内建函数对象

概念: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

posted @ 2024-03-13 15:18  バカなの  阅读(5)  评论(0编辑  收藏  举报