函数对象二元函数.cpp

牧云@^-^@ 提交于 2020-01-11 03:47:41

《C++STL基础及应用》

#include <iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
//利用二元函数是学生成绩升序排列

/*函数对象是重载了operator()的类的一个实例,operator()是函数调用运算符
标准C++库根据operator()参数个数为0个,1个,2个加以划分,主要有以下5种类型
发生器:一种没有参数且返回一个任意类型值的函数对象,例如随机数发生器
一元函数:一种只有一个任意类型的参数,且返回一个可能不同类型值的函数对象
二元函数:一种有两个任意类型的参数,且返回一个任意类型值的函数对象
一元判定函数:返回bool型值的一元函数
二元判定函数:返回bool型值的二元函数*/

/*STL二元函数基类是一个模板类,原型如下
 *template<class Arg1,class Arg2,class Result>
 *struct binary_function{
 *  typedef Arg1 first_argument_type;
 *  typedef Arg2 second_argument_type;
 *  typedef Result result_type;
 * }
 * */
class Student{
public:
    string name;
    int grade;
public:
    Student(string name ,int grade)
    {
        this->name=name;
        this->grade=grade;
    }
    bool operator<(const Student s)
    {
        return grade<s.grade;
    }

};
ostream& operator<<(ostream& os,const Student &s)
{
    os<<s.name<<"\t"<<s.grade<<"\n";
    return os;
}

//由于是Student的比较,所以不能在Student内部重载成员函数,才重新建立了binary_sort类
//二元函数重载 用binary_function
template<class _inPara1,class _inPara2>
class binary_sort:public binary_function<_inPara1,_inPara2,bool>
{
public:
    //(_inPara1 in1,_inPara2 in2)用于传入二元函数的2个参数
    //()内用于初始化类
    bool operator()(_inPara1 in1,_inPara2 in2)
    {
        return in1<in2;
    }
};

int main()
{
    Student s1("zhangsan",60);
    Student s2("lisi",80);
    Student s3("wangwu",70);
    Student s4("zhaoliu",90);
    vector<Student> v;
    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);
    v.push_back(s4);
    sort(v.begin(),v.end(),binary_sort<Student,Student>());
    copy(v.begin(),v.end(),ostream_iterator<Student>(cout, ""));
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!