内建函数

一、内建函数对象的意义

分类

  • 算术仿函数
  • 关系仿函数
  • 逻辑仿函数

必须包含<functional>头文件

二、算术仿函数

功能描述

  • 实现四则运算
  • 其中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>
#include <functional>
using namespace std;
void test1()
{
    negate<int> mni;//取反
    cout << mni(50) << endl;
}
void test2()
{
    plus<int> mpi;//返回值,两个参数的类型底层是写的相同的,所以只用写一个
    cout << mpi(10, 50) << endl;
}
void test3()
{
    divides<int> mpi;//返回值的类型是int,
    cout << mpi(10, 3) << endl;//输出为3
}
int main()
{
    test1();
    test2();
    test3();
    system("pause");
}

三、关系仿函数

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>        //小于等于
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
void myPrint(const int & elem)
{
    cout << elem << endl;
}
void test1()
{
    vector<int> mv;
    mv.push_back(10);
    mv.push_back(123);
    mv.push_back(123);
    mv.push_back(42);
    mv.push_back(5);
    for_each(mv.begin(), mv.end(), myPrint);
    sort(mv.begin(), mv.end(), greater<int>());
    for_each(mv.begin(), mv.end(), myPrint);
}

int main()
{
    test1();
    system("pause");
}

四、逻辑仿函数

template<class T> bool logical_and<T>        //逻辑与
template<class T> bool logical_or<T>        //逻辑或
template<class T> bool logical_not<T>        //逻辑非
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void myPrint(int elem)
{
    cout << elem << endl;
}
logical_not<int> m1;
void mlogic_not(int & elem)
{
    elem = m1(elem);
}
void test1()
{
    vector<int> mv;
    mv.push_back(1);
    mv.push_back(0);
    mv.push_back(0);
    mv.push_back(1);
    mv.push_back(5);
    for_each(mv.begin(), mv.end(), myPrint);
    for_each(mv.begin(), mv.end(), mlogic_not);
    for_each(mv.begin(), mv.end(), myPrint);
}
int main()
{
    test1();
    system("pause");
}
\\结果
1 0 0 1 5
0 1 1 0 0