首页 > 编程语言 > 详细

C++仿函数(二)为什么使用使用仿函数

时间:2020-04-28 09:09:47      阅读:76      评论:0      收藏:0      [点我收藏+]

考虑以下需求:
统计某个容器中符合规定的元素个数,比如这里规定就是小于某个数(如果有其他需求可以自定义一个仿函数)
来我们来写代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>
using namespace std;
template <typename Ty>
bool my_less(Ty i){
    return i < 5; 
}
int main(int argc,char** argv){

    int a[] = {1,2,3,4,5,6,7,8,9,10};
    vector<int> vec(a,a+10);
    cout<<count_if(vec.begin(),vec.end(),my_less<int>)<<endl;
}

需求变动:我们要可以传threshold怎么办呢,那么这就是 binary_function(2个参数)

我们来写代码吧。

#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>
using namespace std;
template <typename Ty>
bool my_less(Ty i){
    return i < 5; 
}

template <typename Ty>
struct my_less1
{
    Ty threshold;
    my_less1(Ty i):threshold(i){}

    bool operator () (Ty num){
        return num <threshold;
    }
};
int main(int argc,char** argv){

    int a[] = {1,2,3,4,5,6,7,8,9,10};
    vector<int> vec(a,a+10);
    cout<<count_if(vec.begin(),vec.end(),my_less<int>)<<endl;
    int x = 8;
    cout<<count_if(vec.begin(),vec.end(),my_less1<int>(x))<<endl;
}

我们经常什么地方用到仿函数呢

1.排序
举个例子吧:比较成绩(这是一段很久之前写的代码)

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct E{
    char name[100];
    int age;
    int score;
    bool operator < (const E &b) const{  //重定义小于运算符号
        if(score!=b.score) return b.score<score;
        int tmp=strcmp(name,b.name);
        if(tmp!=0) return tmp>0;
        else return b.age<age;
    }
}buf[1000];
int main()
{       
    cout<<"请输入要比较的学生的人数:"<<endl;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>buf[i].name>>buf[i].age>>buf[i].score;
    }
    sort(buf,buf+n);
    cout<<"学生成绩排名比较为:"<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<buf[i].name<<" "<<buf[i].age<<" "<<buf[i].score<<endl;
    }
    return 0;
}
  1. 自增加之类的操作
    这里有个之前的代码:
    https://www.cnblogs.com/cyssmile/p/12790430.html
#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
template <typename T>
class AddValues{

    private:
        T val;

    public:
        AddValues(T j):val(j){}
        void operator()(int& i){
            cout<<i + val<<endl;
            i += val;
        }
};
int main(int argc, char** argv){
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    int x =2;
    for_each(vec.begin(),vec.end(),AddValues<int>(x));
    cout<<endl;
    copy(vec.begin(),vec.end(),ostream_iterator<int>(cout, " "));
}
当然要注意 仿函数都是传值,此类算法一般不会改变参数

所以特殊需求可以传引用或者指针

这里有常见的仿函数:
https://www.cnblogs.com/cyssmile/p/12790854.html

C++仿函数(二)为什么使用使用仿函数

原文:https://www.cnblogs.com/cyssmile/p/12791302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!