STL算法--函数对象

函数对象

算法的头文件

#include<algorithm> 
//功能:比较、交换、查找、遍历、复制、修改、反转、排序、合并等
#include<numeric>
//数学运算(加法和乘法序列上的一些操作)
#include<functional>
//定义了模板类,用于声明函数对象

函数对象,重载了()操作符的类定义的对象,又叫仿函数。

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;


//函数对象,类重载了()
template<typename T>
class ShowElim
{
public:
    ShowElim()
    {
        n = 0;
    }
    void Printf()
    {
        cout << "n" << n << endl;
    }

    void operator()(T &a) //重载()操作符
    {
        n++;
        cout <<"n="<< n << endl;
        cout << a << endl;
    }
private:
        int n;
};
//函数对象和普通函数的区别
//普通函数
template<typename T>
void funShowElim(T &a)
{
    cout << a << endl;
}

void funShowElim2(int &a)
{
    cout << a << endl;
}

void main01()
{
    int a = 10;
    ShowElim<int> showelim;
    showelim(a);//函数对象的()的执行 很像一个函数 ---仿函数
    funShowElim<int>(a);

}

main01的执行结果:
这里写图片描述

//函数对象属于类对象,能突破函数的概念,能保持调用状态信息
//函数对象的好处
void main02()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
//用for_each()来遍历
    for_each(v1.begin(), v1.end(), ShowElim<int>());//匿名函数对象 匿名仿函数
    cout << endl;
    for_each(v1.begin(), v1.end(), funShowElim2);//通过回调函数 谁使用for_each谁填写回调函数的入口地址

    ShowElim<int> s2;



----------
//for_each的函数声明:

    //函数对象做函数参数
    //template<class _InIt,
    //class _Fn1> inline
    //  _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    //{ // perform function for each element
    //      _DEBUG_RANGE(_First, _Last);
    //      _DEBUG_POINTER(_Func);
    //      _For_each(_Unchecked(_First), _Unchecked(_Last), _Func);

    //      return (_STD move(_Func));


----------


    s2=for_each(v1.begin(), v1.end(), s2);
    //这里设计形参和实参的问题,所以要用s2来接返回值。
    cout << endl;
    s2.Printf();


}

main02的执行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37393277/article/details/69659275
今日推荐