C++如何写adaptable仿函数

Generic Programming and the STL笔记1 1 泛型编程和面向对象编程不同,它并不要求你通过额外的间接层来调用函数;它让你撰写完全一般化并可重复运用的算法,其效率和“针对特定数据类型而设计”的算法旗鼓相当。 2 STL编译效率不高。因为需要template引数推导(argument deduction)和具现化(instantiation),但不影响运行效率。 3 对象持久性(object persistence):保存 阅读详情

关于仿函数很多博客上都有,形式很简单,用途也很多。
一句话总结:重载了()运算符的类可以称之为仿函数functor
现在写一个“比较”

class MyLess{
public:
    bool operator()(int a, int b){
        return a < b;
    }
}; 

大多数人会这样写,其实这样写没有错,而且基本所有算法都可以通过
比如:

class MyLess{
public:
    bool operator()(int a, int b){
        return a < b;
    }
};
class Less10{
public:
    bool operator()(int a){
        return a < 10 ? true : false;
    }   
};
int main() {
    vector<int> v{1, 40, 5, 60, 5, 6};
    cout<<count_if(v.begin(), v.end(), Less10())<<endl;
    sort(v.begin(), v.end(), MyLess());
    for(auto i : v)
        cout<<i<<" ";
    cout<<endl;
}

上面两个仿函数MyLess、Less10。两个算法count_if、sort。
这样的仿函数基本上可以用stl中所有的算法。
看看STL中less怎么写的吧

template <class T>
struct less : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x < y; }
};

除了模板,还有就是less继承了个binary_function,这个是什么鬼?
为什么要继承它?继承它有啥用?
看一个例子:

class MyLess{
public:
    bool operator()(int a, int b){
        return a < b;
    }
};
int main() {
    vector<int> v{1, 40, 5, 60, 5, 6};
    cout<<count_if(v.begin(), v.end(), bind2nd(less<int>(), 50))<<endl;
}

bind2nd这个叫绑定器,可以绑定一个仿函数的第二个参数。
为啥要使用绑定器?看看第段代码,有没有发现我统计数组中小于10的元素个数太单一了?一点都没有可扩展性,当我们要小于50的时候又得再写一个仿函数,太累了。所以绑定器产生了,现在C++11的绑定都是用bind这个函数(这个函数太厉害了,比bind1nd,bind2nd强大的多,有机会可以去了解下)
回到正题,如果我们把less()换成我们自己写的仿函数,编译就有问题,为啥呢?抛开模板,就是没有继承那个什么鬼了。
看看那个鬼张啥样吧

template <class Arg1, class Arg2, class Result>
struct binary_function {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};      

啥?一个成员都木有啊。
其实看STL最大的收获是懂得了typedef的使用,别看简单的一个typedef,几乎在stl中无处不在,绑定器,适配器,萃取器等等,都和typedef密不可分,但是我们正真写程序用typedef的又有几个。
回到正题,我们在看看bind2nd

template <class Operation, class T>
inline binder2nd<Operation> bind2nd(const Operation& op, const T& x) {
  typedef typename Operation::second_argument_type arg2_type;
  return binder2nd<Operation>(op, arg2_type(x));
}

原来bind2nd要用typedef得到第二参数的类型啊,有啥用?为了检查第二参数是否类型正确,如果转换不了那就直接出错
so,结果就出来了,为啥要继承那个鬼。
再继续看看binder2nd吧

template <class Operation> 
class binder2nd
  : public unary_function<typename Operation::first_argument_type,
              typename Operation::result_type> {
protected:
    Operation op;
    typename Operation::second_argument_type value;
public:
    binder2nd(const Operation& x,
              const typename Operation::second_argument_type& y) 
    : op(x), value(y) {}
    result_type operator()(const argument_type& x) const {
    return op(x, value); 
    }
};

这里也需要知道参数类型和返回类型,而且binder2nd本身也是一个仿函数,而且继承了unary_function类

template <class Arg, class Result>
struct unary_function {
    typedef Arg argument_type;
    typedef Result result_type;
};

到此为止我们可以总结了

仿函数如果要融入STL那么需要继承一个类
一个参数用unary_function
两个参数用binary_function

注意:为啥binary_function有两个参数还是继承unary_function呢?
因为binary_function需要别人推导的只有第一参数而已,第二参数类型已经确定,在本类中已经typedef了

FPGA技术解析:AMD与Intel产品对比与应用实践 FPGA(现场可编程门阵列)是一种通过硬件可编程实现定制化计算架构的半导体器件,其核心原理是通过可配置逻辑块(CLB)和互连资源构建并行计算通路。随着异构计算和AI加速需求的增长,现代FPGA已演变为集成处理器核、高速接口和专用加速引擎的异构平台,在5G通信、自动驾驶等需要低延迟高吞吐的场景中展现出独特优势。以AMD Xilinx Versal和Intel Stratix 10为代表的先进FPGA产品,通过7nm/14nm工艺实现了更高性能密度,其中Versal的自适应计算架构整合了标量处理、可编程逻辑和A 阅读详情

相关推荐

NXP GDFLIB数字滤波器库在Cortex-M0+ MCU上的集成与应用实战

数字信号处理(DSP)是嵌入式系统实现信号去噪、数据平滑等功能的基石,其核心在于将连续信号转换为数字序列并进行数学运算。定点数运算因其确定性和高效性,成为资源受限微控制器(MCU)实现DSP算法的关键技术,它避免了浮点运算的巨大开销。在电机控制、传感器采集等实时性要求高的场景中,高效且稳定的滤波算法至关重要。NXP针对其Cortex-M0+内核MCU推出的通用数字滤波器库(GDFLIB),正是这样一个高度优化的解决方案。GDFLIB聚焦于指数平滑和一阶/二阶IIR等常用滤波器,通过汇编和优化C语言实现,为开

cumi7754的博客 502

C++ STL初识(详解+示例代码):仿函数

仿函数又称为函数对象是一个能行使函数功能的类,仿函数是定义了一个含有operator()成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,是一个函数对象,它将函数作为参数传递的方式来使用。写一个简单类,除了维护类的基本成员函数外,只需要重载 operator() 运算符。这样既可以免去对一些公共变量的维护,也可以使重复使用的代码独立出来,以便下次复用。STL 中也大量涉及到仿函数。

ylh的博客 987

无刷直流电机矢量控制(四):基于滑模观测器的无传感器控制

无刷直流电机矢量控制,采用转速、电流双环控制,电流环dq解耦,d轴采用id=0控制,q轴采用转速外环。采用滑模观测器(SMO),根据电压电流信息进行电机位置角度动态估算,模型可直接运行,转速和角度跟踪精度较高。 本文整理了该方法的基本原理,介绍了在MATLAB/Simulink中的建模和仿真过程,最后附上完整的模型文件。 一、基本原理 滑模观测器(下文简称SMO)是基于滑模变结构控制方法的一种状态观测器。其针对无刷直流电机转子位置估算的实现过程如下。 假设采用矢量控...

Forster-C的博客 6865

仿函数的用法

仿函数:仿函数又名函数对象:{    1、调用者:可以像函数一样被调用;    2、被调用者:以对象所定义的function call operator扮演函数的实质角色}仿函数的主要作用:以tempplate参数指定你要采取的策略。以sort()为例,其第一个版本是以operator &lt; 为排序时的元素位置调整依据,第二个版本则允许用户指定任何“操作”,务求排序后的两两相邻元素都能操作结果...

We_are_family678的博客 1730

Apple CarPlay Certification Guide December 2022 解析V1.0

Apple CarPlay Certification Guide December 2022更新说明

m0_74450450的博客 703

在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南

本文详细介绍了在Ubuntu 22.04系统上从零搭建TrinityCore 3.3.5服务器的完整流程,包括环境准备、源码编译、数据库配置、资源文件处理及性能调优等关键步骤。特别针对国内开发者和低配置用户优化,提供保姆级避坑指南,帮助用户高效搭建魔兽世界经典旧世版本私服。

weixin_33393017的博客 304

C++仿函数C++学习笔记之仿函数

C++仿函数C++学习笔记之仿函数 函数调用运算符重载 由于重载之后使用的方法非常像函数的调用,因此称为仿函数 仿函数没有固定写法,非常灵活。 //函数调用运算符()也可以重载 //由于重载后使用的方式非常像函数的调用,因此称为仿函数 //仿函数没有固定写法,非常灵活 #include <iostream> #include <string> using namespace std; class Person { //默认构造函数 //默认析构函数 //默认拷贝构造函数 //

qq_36711295的博客 404

Goldwasser-Micali 公钥加密系统

1、二次剩余问题 对于整数n ,定义Zn∗={a∈Zn,gcd(a,n)=1}Z^*_n=\{ a∈Z_n,gcd(a,n) =1\}Zn∗​={a∈Zn​,gcd(a,n)=1} 。当存在d∈Znd \in Z_nd∈Zn​ ,使得 d2≡a mod nd^2 \equiv a \, mod \,nd2≡amodn ,称 a 为模 n 的二次剩余;否则称 a 为模 n的二次非剩余。判断 a 是否为模 n 的二次剩余的问题称为模n 的二次剩余问题。 \rule[-10pt]{14.3cm}{0.05em}

不染心的博客 4312

C++ 仿函数

仿函数仿函数,顾名思义就是模仿函数模仿了函数的什么呢?

qq_51216031的博客 1593

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6443

手把手教你学Simulink——逆变器场景:基于PR控制器的单相逆变器并网控制策略仿真

摘要:本文详细介绍基于PR控制器的单相逆变器并网控制策略的Simulink仿真实现。首先分析PR控制器在单相逆变应用中的优势,然后逐步讲解模型搭建过程,包括主电路设计(直流电源、全桥逆变器、L滤波器)、控制回路实现(参考电流生成、坐标变换、PR控制器设计)以及关键参数设置。通过仿真验证了PR控制器对电网频率的精确跟踪能力,并网电流THD<3%。最后提出优化建议,如加入状态观测器、自适应参数整定等改进方向。该建模方法为可再生能源系统中的逆变器控制提供了有效验证手段。

MHD0815的博客 497

C++——仿函数

一、重载operator()//用class定义public:二、创建仿函数对象Mygreater())这里是创建仿函数对象,无论是类还是struct都需要经过创建仿函数对象类/结构体模板打印return 0;

2403_87935067的博客 439

vue3+vite:引入tailwindcss不生效的原因,详细解决Tailwind配置没问题但就是不生效的情况,配置正确无报错但样式没有生效(包括tailwindcss在Vue2使用不生效解决方案)

vue3 tailwind使用教程以及tailwind不生效的问题,vue3+vite引入tailwindcss不生效的原因,tailwindcss配之后不生效怎么办,如何解决tailwinscss不生效的原因,Vue3项目使用tailwindcss在Vue2使用,不生效解决,如何解决使用 Tailwind CSS 后出现的样式不生效的问题?tailwindcss配之后不生效 tailwindcss不生效,为什么我的 Tailwind css 类没生效,解决使用 Tailwind 时样式不生效的问题,配置没

✅ 精选推荐文章 4127

C++ 自定义函数adaptable条件

使用bind1st/ bind2nd作为例子: 在C++ 11之后,可以使用bind(),绑定: 函数,仿函数,成员函数,成员变量 绑定函数、仿函数,如:bind(func,first_arg,sec_arg,...)参数个数取决func参数个数,bind返回一个对象,或者可以使用占位符,在命名空间placeholders中,暂不绑定参数,在返回对象后 对象(, , , )传入占位符内的参数,顺序有关。在绑定成员函数或者变量,_1一定为对象地址,bind第一个参数为 class_name::func_nam

weixin_46609502的博客 172

YOLO项目部署:从Python脚本到Docker容器的企业级交付全流程

YOLO模型企业级Docker部署方案 核心挑战 环境一致性:解决"本地能跑,服务器崩掉"问题 可扩展性:支持单实例到多实例扩展 稳定性:确保99.9%可用性 部署流程 项目改造:模块化代码,分离配置 Docker镜像:支持CPU/GPU环境 API服务:封装推理逻辑 监控告警:实现自动化运维 技术方案 需求 解决方案 环境一致性 Docker镜像+依赖冻结 可扩展性 K8s+负载均衡 稳定性 健康检查+自动重启 项目结构 模块化代码组织 外部化配置管理 精确依赖版本控制 摘要重点:通过

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1229

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++源码剖析和泛型编程(侯捷)(八) 仿函数和适配器

仿函数 当你要求一些特殊的准则时,就需要一般函数或仿函数的形式来告诉算法。 又称函数对象,为算法提供一些自定义的函数规则(例如以特定的条件实现累计 accumulate)。 规模较小,比较容易由用户自己实现,并加入标准库中作为自己应用的部分。 仿函数本质是一个类(struct),类中必须实现重载小括号(operator())使用时通过加上()来成为临时对象调用。 分类:算术类(加减),逻辑...

Zy_05_11的博客 428

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++笔记:三种适配器(分别修饰函数、迭代器、容器)

C++笔记:三种适配器(分别修饰函数、迭代器、容器)

weixin_57139639的博客 1311

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Effective STL 40 Make functor classes adaptable

ptr_fun & unary_function & binary_function & bind1st &bind2nd

ruihuank的博客 348

自适应函数符和函数适配器(Adaptable Functors and Function Adapters)

最近在看c++ primer plus,关于自适应函数符的“自适应”不是很理解。调查了一下源码。template&lt;class _Arg1,  class _Arg2,  class _Result&gt;  struct binary_function  { // base class for binary functions  typedef _Arg1 first_argument_ty...

weixin_37758998的博客 1305

2026年五大记事软件评测与选型指南

记事软件作为效率工具的核心组件,通过结构化数据管理提升个人生产力。其技术原理基于云端同步、自然语言处理和智能算法,实现信息的快速捕获与智能提醒。在现代工作场景中,优秀的记事软件需要平衡功能性(如AI模板生成)与隐私性(如端到端加密),Notion AI等工具通过跨平台协作和知识图谱技术,大幅降低信息管理成本。评测显示2026年主流产品在四象限任务管理、生物识别安全等热词功能上持续创新,特别适合知识工作者构建个人知识库。

weixin_34008933的博客 375

Term40:若一个类是函数子(functor),则应使它可配接(adaptable)

#include<iostream> #include<vector> #include<algorithm> #include<functional> using namespace std; struct myPred :public unary_function<int,bool>{//一个规范的Functor必须这么干! //因为这么干你的functor的通用型就更强! bool operator()(int v) { .

weixin_44980842的博客 1204

【一文读懂】《Effective STL》50条有效使用STL的经验

本文按 Scott Meyers《Effective STL》(2001)原书 8 章顺序,系统梳理全部 50 条条款,覆盖容器选型、vector/string、关联容器、迭代器、算法、函数子、STL 实战与其他议题。对初学者易混淆处配代码示例,并在关键处标注 C++11/20 的现代等价写法(如 unordered_map、std::erase_if、lambda 取代 bind1st)。

码工许师傅 366

Miva:从Rust到新语言的蜕变之旅

文章摘要: 作者分享了设计编程语言Miva的历程,该语言受Rust启发但追求更简化的内存安全与灵活性。初期尝试用Rust实现编译器时遇到解析器(Parser)和语义分析(Semantic)的困难,后转用OCaml快速原型开发,但因其语法晦涩和工具链问题,最终迁移到Rust并借助AI加速。模块化设计通过C++头文件转换实现,而类型检查器(TypeChecker)的开发最为棘手。作者鼓励开发者克服初期难关,强调现代AI工具(如Agent)大幅降低了语言设计的门槛,核心挑战仅集中在最初两周。

elvaqiao的博客 2009

STL 简单 functors(function objects)的实现

1.简介          本文介绍的东西,在STL历史上有两个不同的名称。仿函数(functors)是早期的命名,C++标准定案后,采用的新名称是函数对象(function objects)。          函数对象,顾名思义,首先是对象(后面我们可以看到,函数对象是用struct而不是class定义的),其次,我们可以像调用函数一样,调用函数对象。这和函数指针很像,遗憾的是,函数指针不

chengonghao的博客 1193

Eclipse插件开发笔记三:判断项目是否是J2ME项目

我需要达到的目标是:只有在项目是J2ME项目时,才会在popupmenu上出现我的菜单Huayusoft;因此,我需要在plugin.xml中添加条件判断,判断当前选中的是J2ME项目。而判断一个项目是否是J2ME项目,需要eclipseme插件提供支持。Eclipseme插件本身也提供了这个功能。当当前选中的项目是Java项目时,Eclipseme会弹出菜单J2ME-->Convert to J2ME project;当当前选中的项目是J2ME项目时,Eclipseme会弹出菜单J2ME-->Create

Pi的空间 1703

容器适配器(Adapter):stack,queue,priority_queue

容器适配器思想,参考帖子:http://bbs.youkuaiyun.com/topics/310196740 adapter原意是插座、适配器、接合器的意思。现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动。这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西。你需要对它进行一些包装,作一些限制,使之只能在一

ceasadan的博客 613
上一篇: Centos不能解析域名
下一篇: 加载别人代码到沙箱环境运行
帅东
博客等级 码龄11年 676粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值