IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> STL5:仿函数 -> 正文阅读

[C++知识库]STL5:仿函数

1、概念

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

2、场景

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

3、使用

3.1 C语言的处理方式

使用函数指针和回调函数来实现代码复用。例如qsort()

#include <stdio.h>
#include <stdlib.h>

int arr_sort(const void *a,const void *b){
    return *(int *)a-*(int *)b;
}

int main(){
    int arr[5]={4,1,2,5,6};
    qsort(arr,5,sizeof(arr[0]),arr_sort);
    int i;
    for(i=0;i<5;i++){
        printf("%d\n",arr[i]);
    }
    return 0;
}

3.2 C++语言的处理方式

(1)函数指针方式

#include<iostream>
#include<algorithm>

using namespace std;

inline bool Sort(int a,int b){
    return a > b;
}
inline void Display(int a){
    cout << a << endl;
}

int main(){
    int arr[]={4,1,2,5,6};
    sort(arr,arr+5,Sort);
    for_each(arr,arr+5,Display);
    return 0;
}

(2)函数模板方式

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

template<class T>
inline bool Sort(T const& a,const &b){
    return a<b;
}

template<class T>
inline void Display(T a){
    cout << a << endl;
}

int main(){
    int arr[5]={4,1,2,5,6};
    sort(arr,arr+5,Sort<int>);
    for_each(arr,arr+5,Display<int>);
    return 0;
}

(3)仿函数方式

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

class Sort{
public:
    bool operator()(int a,int b)const {
        return a >b;
    }
};

class Display{
public:
    void operator()(int a)const {
        cout << a << endl;
    }
};
int main(){
    int arr[5]={4,1,2,5,6};
    sort(arr,arr+5,Sort());
    for_each(arr,arr+5,Display());
    return 0;
}

(4)仿函数模板方式

template<class T>
class Sort{  
public:  
    inline bool operator()(T const& a,T const& b) const {
      return a > b;
    }   
};
template<class T>
class Display{
public:
  inline void operator()(T const& a) const{
    cout << a << endl;
  } 
};
int main()  
{  
    int arr[5] = { 4, 1, 2, 5, 6 }; 
    sort(arr, arr+5,Sort<int>());  
    for_each(arr,arr+5,Display<int>());
    return 0;   
}

4、STL的仿函数

在头文件中定义了如下三类仿函数:

4.1 算术类仿函数

在这里插入图片描述

(1)使用实例1

累积相乘

#include <iostream>
#include <numeric>
#include <vector>
#include <functional>

using namespace std;

int main(){
    int arr[]={1,2,3,4,5};
    vector<int> iv(arr,arr+5);
    cout << accumulate(iv.begin(),iv.end(),1,multiplies<int>()) << endl;
    return 0;
}

Boost lambda表达式

   cout << accumulate(res.begin(),res.end(),1,[](int res,int n){return res*n;}) << endl;

(2)使用实例2

两个数组对应元素相加
#include
#include
#include

using namespace std;

inline void Print(int a){
cout << a << endl;
}

int main(){
int first[]={1,2,3,4,5};
int second[]={10,20,30,40,50};
int results[5];
transform(first,first+5,second,results,std::plus());
for_each(results,results+5,Print);
return 0;
}

lambda表达式

  transform(vec.begin(),vec.end(),res.begin(),vec.begin(),[](int n,int m){return n+m;});

基本实现

template<typename T>
struct plus
{
    T operator()(int a,int b){
        return a+b;
    }
};

template<typename T>
struct multiplies
{
    T operator()(int a,int b){
        return a*b;
    }
};

4.2 关系运算类仿函数

在这里插入图片描述

(1)使用实例

降序排序

#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

inline void Print(int a){
    cout << a << endl;
}

int main(){
    int arr[]={1,2,3,4,5};
    sort(arr,arr+5,greater<int>());
    for_each(arr,arr+5,Print);
    return 0;
}

lambda表达式

sort(arr,arr+5,_1>_2);

基本实现

template<typename T>
struct greater{
    bool operator()(const T& a,const T& b){
        return a>b;
    }
};
template<typename T>
struct less{
    bool operator()(const T& a,const T& b){
        return a<b;
    }
};

4.3 逻辑运算仿函数

在这里插入图片描述

(1)布尔数组整体取反

#include <iostream>
#include <functional>
#include <algorithm>

using namespace std;

inline void Print(bool a ){
    cout << a << endl;
}

int main(){
    bool values[]={true,false,true,false};
    transform(values,values+4,values,logical_not<bool>());
    cout.flags(ios::boolalpha);
    for_each(values,values+4,Print);
    return 0;
}

lambda表达式:

transform (values, values+4, values, !_1);

(2)两个布尔数组对应元素相与

#include <iostream> //cout ,boolalpha
#include <functional>//logical_not
#include <algorithm> //transform

using namespace std;

inline void Print(bool a ){
    cout << a << endl;
}

int main(){
    bool values1[]={true,false,true,false};
    bool values2[]={false,true,false,true};
    bool res[4];
    transform(values1,values1+4,values2,res,logical_and<bool>());
    cout.flags(ios::boolalpha);
    for_each(res,res+4,Print);
    return 0;
}

lambda表达式:

transform(values1, values1+4,values2, result, _1 and _2);
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-13 22:34:39  更:2022-04-13 22:42:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:15:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码