六、STL容器:STL仿函数总结

2023-11-10

6 STL仿函数

6.1 概念

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

6.2 场景

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

6.3. 使用

6.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("%i\n", arr[i]);  
   }
   return 0;  
}

6.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[5] = { 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,T 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 <vector>
#include <list>
#include <algorithm>
using namespace std;
class Compare{
int asc;
public:
     Compare(bool asc):asc(asc){}
     bool operator()(int a,int b){
     	return asc>0?a>b:a<b;
     }
};
int main(){
    int arr[] = {1,4,2,3,7,5};
    for(auto p:arr){
    	cout << p << " ";
    }
    cout << endl;
    //sort(arr,arr+6);
    //sort(begin(arr),end(arr));
    int asc;
    cin >> asc; //根据输入数值进行排序
    //定义仿函数,也称函数对象
    Compare p(asc);
    sort(begin(arr),end(arr),p);
    for(auto p:arr){
    	cout << p << " ";
    }
    cout << endl;

    cout << "---------list-----------" << endl;
    list<int> li = {1,4,2,3,5};
    for(auto p:li){
    	cout << p << " ";
    }
    cout << endl;
    li.sort();
    for(auto p:li){
    	cout << p << " ";
    }
    cout << endl;
}
1 4 2 3 7 5 
1
7 5 4 3 2 1 
---------list-----------
1 4 2 3 5 
1 2 3 4 5 

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;   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

六、STL容器:STL仿函数总结 的相关文章

随机推荐

  • 经验误差与过拟合

    一 经验误差 一般在分类问题中 我们把分类错误的样本数占样本总数的比例称作 错误率 即如果在m个样本中有a个样本分类错误 则错误率为E a m 则相对的 1 E称为精度 即精度 1 错误率 更一般的 我们把学习器的实际预测输出与样本的真实输
  • 微信小程序实战项目

    基于微信小程序的在线商城点单系统 前言 闲来无事 想以后自己开一个小超市或者小吃店 能够支持线上下单 既方便客户也方便自己 系统采用C 语言作为后端实现与小程序的交互 给用来学习或者想自己开个小店的朋友当个参考 文末获取源码联系 精彩专栏持
  • 一文弄懂Numpy中ndarray的维度(dimension)/轴数(axis/axes)问题

    Numpy库的核心是ndarray 实际上就是N维数组 N dimensional array 关于这个数据对象的详细介绍 参考官方文档最为合适 有一点要注意的是 ndarray的内置方法只有30多个 常用的如求平均值可以写a mean 但
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • Java知识点概览

    Java 基础 说说自定义注解的场景及实现 利用自定义注解 结合SpringAOP可以完成权限控制 日志记录 统一异常处理 数字签名 数据加解密等功能 实现场景 API接口数据加解密 1 自定义一个注解 在需要加解密的方法上添加该注解 2
  • 树形结构数据构建算法

    在一些前端开发过程中 我们通常需要将后台查询出来的集合数据进行相应的转换 转成树形结构对象 比如常用的评论区数据就是一种典型的树形结构数据 如下图所示 而后台服务端传来的数据通常是一种普通的集合 元素中有 id 和 pid 以此构成 父子节
  • 程序员计算器

    程序员计算器 这是我们WIN7系统下的程序员的模式 你可以使用不同的进制来表示数 也可以限定数据的字节长度 而且每个数都在下方给出了其二进制的值 非常贴心 所谓程序员计算器 除了这些 还包括各种位运算 下面一一介绍 And Or Not X
  • vue项目如何解决跨域问题

    1 什么是跨域 1 跨域指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是浏览器施加的安全限制 2 浏览器执行javascript脚本时 会检查这个脚本属于哪个页面 如果不是同源页面 就不会被执行 3 比如你在www 垃圾
  • window10安装MySQL数据库

    准备好软件 MySql的下载参考 1137条消息 mysql下载与安装过程 weixin 40396510的博客 CSDN博客 mysql数据库下载安装 1137条消息 安装MySQL的常见问题 二木成林的博客 CSDN博客 sc不是内部或
  • 手撸一套RBAC权限系统

    文章来源 RBAC权限系统分析 设计与实现 shuwoom com 目前 使用最普遍的权限管理模型正是RBAC Role Based Access Control 模型 这篇文章也主要是介绍基于RBAC的权限管理系统 我会从RBAC是什么
  • sql语句之DML语句

    1 SELECT 语句 SELECT 语句用于从表中选取数据 结果被存储在一个结果表中 称为结果集 SELECT 列名称 FROM 表名称 或 SELECT FROM 表名称 例如 eg SELECT LastName FirstName
  • leetcode面试频率

    参考 http blog csdn net yutianzuijin article details 11477603 ID 问题 频率 数据结构 算法 1 Two Sum 5 array set sort Two Pointers 8 S
  • 不踩坑的Python爬虫:如何快速学会爬取大规模数据

    如果你仔细观察 就不难发现 懂爬虫 学习爬虫的人越来越多 一方面 互联网可以获取的数据越来越多 另一方面 像 Python这样的编程语言提供越来越多的优秀工具 让爬虫变得简单 容易上手 无私分享全套Python爬虫干货 如果你也想学习Pyt
  • 【Android】OpenGL ES---绘制3D图形、应用纹理贴图

    绘制3D图形 glDrawElements int mode int count int type Buffer indices 根据indices指定的索引点来绘制三角形 第一个参数mode指定绘制的图形类型 可设置为GL10 GL TR
  • Matlab玩出新高度,变身表白女孩神器

    Matlab还可以这样玩儿 每逢节日愁哭程序员 不知道该送什么给喜欢的女孩子 在这里教你用Matlab玩儿出属于程序员的浪漫 送给她一整天的惊喜 一 效果图 二 完整模板代码 三 教你如何个性化定制 个性化定制1 个性化定制2 个性化定制3
  • ChatGLM2-6B安装部署(详尽版)

    1 环境部署 合理的上网工具 安装Anaconda3 安装GIT 安装GUDA 11 8 安装NVIDIA 图形化驱动 522 25版本 如果电脑本身是更高版本则不用更新 1 1 检查CUDA 运行cmd或者Anaconda 运行以下命令
  • 通讯录(动态实现与文件优化版)

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 清空所有联系人 以名字排序所有联
  • backward()说明

    1 out backwark 中out是一个标量 此时可以直接使用out backwark import torch from torch autograd import Variable 生成一个内容为 2 3 的张量 Varibale
  • 半角和全角的区别

    很多时候我们阅读代码指导或者其他输入法总是会提到全角和半角 那么他们的区别是啥呢 区别 半角全角主要是针对标点符号来说的 全角标点占两个字节 半角占一个字节 而不管是半角还是全角 汉字都还是要占两个字节 英文半角占一个字节 也就是1byte
  • 六、STL容器:STL仿函数总结

    6 STL仿函数 6 1 概念 模仿函数的类 使用方式如同函数 本质是类中重载括弧运算符operator 6 2 场景 不同函数复用相同处理代码 6 3 使用 6 3 1 C语言的处理方式 使用函数指针和回调函数来实现代码复用 例如qsor