c++基础 8.4_(STL)仿函数

本文介绍了C++中的仿函数概念,强调其在STL中的应用场景,特别是作为set类的比较操作模板。通过实例展示了如何利用仿函数、函数指针和模板函数实现数据处理,并探讨了C、C++以及STL中处理函数复用的不同方式。重点内容包括仿函数在set中的使用,以及与模板和函数指针的组合应用。
摘要由CSDN通过智能技术生成

1. 概念

模仿函数的类,使用方式如同函数。本质是类中重载括弧运算符operator()

2. 场景

不同函数复用相同处理代码。

(***)3. 仿函数+模板+STL

3.1. 仿函数作为set类的比较操作模板

(1)在模板参数中添加仿函数类可以改变set升降序,实质:重载()运算符


//class
class Greator{
      //(1) 在模板参数中添加仿函数类可以改变set升降序;
public:
    bool operator()(int a,int b){
   
        return a > b;
    }
};

//main()

set<int,Greator> s; // 在模板参数中添加仿函数类可以改变set升降序

(2)可以多定义几个仿函数类,用来调用主类的成员函数;

//class
class AgeComp{
      //(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
    bool operator()(const Student& a,const Student& b){
   
        return a.GetAge() > b.GetAge();
    }
};
class ScoreComp{
     //(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
    bool operator()(const Student& a,const Student& b){
   
        return a.GetScores() < b.GetScores();
    }
};



//main()
 set<Student,AgeComp> stu = {
      
           Student("张三",21,89),
           Student("李四",19,78),
           Student("王五",20,69) 
    };

    Print(stu);
    set<Student,ScoreComp> stu2(stu.begin(),stu.end());  //(2)仿函数的调用:实质:重载()运算符;

(完整代码 见001_fangfunc_.cpp)

#include <set>
#include <vector>
#include <iostream>
using namespace std;

//(1) 在模板参数中添加仿函数类可以改变set升降序;
//(2)可以多定义几个仿函数类,用来调用主类的成员函数;

template<typename T,typename S>
void Print(const set<T,S>& s){
   
    for(auto n:s){
   
        cout << n << " ";
    }
    cout << endl;
}


class Greator{
      //(1) 在模板参数中添加仿函数类可以改变set升降序;
public:
    bool operator()(int a,int b){
   
        return a > b;
    }
};

class Student{
   
    string name;
    int age;
    float scores;
public:
    Student(const string& name,int age,float scores):name(name),age(age),scores(scores){
   }
    int GetAge()const{
   return age;}
    float GetScores()const{
   return scores;}
    friend ostream& operator<<(ostream& os,const Student& s){
   
        return os << s.name << ',' << s.age << ',' << s.scores;
    }
};

class AgeComp{
      //(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
    bool operator()(const Student& a,const Student& b){
   
        return a.GetAge() > b.GetAge();
    }
};
class ScoreComp{
     //(2)可以多定义几个仿函数类,用来调用主类的成员函数;
public:
    bool operator()(const Student& a,const Student& b){
   
        return a.GetScores() < b.GetScores();
    }
};

int main(){
   
    set<int,Greator> s; // 在模板参数中添加仿函数类可以改变set升降序
    s = {
   10,2,2,2,2,13,4,15,6};
    // 数据有序
    // 数据唯一

    Print(s);

    set<Student,AgeComp> stu = {
      
           Student("张三",21,89),
           Student("李四",19,78),
           Student("王五",20,69) 
    };

    Print(stu);
    set<Student,ScoreComp> stu2(stu.begin(),stu.end());  //(2)仿函数的调用:实质:重载()运算符;
    Print(stu2);
}

3.2 函数指针的应用

(1)常用函数指针,实现数据的批量处理;声明的写法;

typedef void (*func_t)(int& n);    //a.常用函数指针,实现数据的批量处理;
void Travel(vector<int>& vec, func_t func){
    //声明的写法;
    for(auto& n:vec){
   
        func(n);
    }
}

(2)调用的写法,多个函数并用;

Travel(vec,Double);      //b。调用的写法,多个函数并用;

(完整代码见002_func_pointer.cpp)

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

void
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值