STL 之 函数对象(函数符)

【软考中级网络工程师】知识点之常用网络诊断和配置命令 本文聚焦软考中级网络工程师必备的网络诊断和配置命令,详细解析 ipconfig、ping、arp 等 11 类核心命令。涵盖各命令的功能、语法、常用参数及应用场景,如 ipconfig 查看配置、ping 测试连通性等。还通过图呈现命令执行逻辑与流程,助读者理解原理。最后结合软考考点回顾重点并提供真题练习,为备考和实际运维提供全面指导,是掌握网络命令的实用参考。 阅读详情

函数对象

    也叫做 函数符 (functor)。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()操作符的类对象(即定义了函数operator()()的类)。

 

    例如,这样定义一个类:
    class Linear
    { private:
         double slope,y0;
      public:
         Linear (double _sl = 1, double _y = 0):slope(_s1),y0(_y) {}
         double operator() (double x) {return y0 + slope * x;}
     };

 

    重载的()操作符将使得能够像函数那样使用Linear对象:
    Linear f1;
    linear f2 (2.5, 10.0);
    double y1 = f1 (12.5);
      // right hand side is f1.operator()(12.5)
    double y2 = f2 (0.4);

    其中y1将使用表达式0 + 1 * 12.5来计算,y2将使用表达式10.0 + 2.5 * 0.4来计算。

 

举例说明函数符调用

 

    函数for_each(),它将指定的函数用于区间中的每个成员:
    for_each(books.begin(), books.end(), ShowReview);

 

    通常,第3个参数可以是常规函数,也可以是函数符。如果把它声明为函数指针,则函数指针指定了参数类型。但由于容器可以包含任意类型,而无法预先知道将使用何种参数类型。所以STL通过使用模板来解决这个问题。


    for_each的原型:
   template<class InputIterator, class Function>
   Function for_each(InputIterator first,InputIterator last, Function f);

 

    假设ShowReview()的原型如下:
    void ShowReview (const Review &);

 

    那么,标识符ShowReview的类型将为 void (*) (const Review &),这也是赋给模板参数Function的类型。对于不同的函数调用,Function参数都可以表示具有重载的()操作符的类类型。最终,for_each()代码将具有一个使用f(...)的表达式。


    在上面范例中,f是指向函数的指针,而f(...)调用该函数。如果最后的for_each()参数是一个对象,则f(...)将是调用重载的()操作符的对象。

 

函数符概念

    生成器(generator),是不用参数就可以调用的函数符。

    一元函数(unary function),是用一个参数可以调用的函数符。

    二元函数(binary function),是用两个参数可以调用的函数符。

    (例如,提供给for_each()的函数符应当是一元函数,因为它每次用于一个容器元素。)

 

    返回bool值的一元函数是 断言 (predicate)。

    返回bool值的二元函数是 二元断言 (binary predicate)。

 

    list模板有一个将断言作为参数的remove_if()成员,该函数将断言应用于区间中的每个元素,如果断言返回true,则删除这些元素。

    例如,下面的代码删除链表scores中所有大于100的元素:
    bool tooBig(int n) { return n > 100; }
    list<int> scores;
    ...
    scores.remove_if(tooBig);

 

    现在假设又要删除另一个链表中所有大于200的值。就必须重新设计一个断言。如果能将取舍值作为第二个参数传递给tooBig(),则可以使用不同的值调用该函数,但断言又只能有一个参数。不过,如果设计一个tooBig类,则可以使用类成员而不是函数参数,来传递额外的信息:

    template<class T>
    class tooBig
    { private:
         T cutoff;
      public:
         tooBig (const T & t): cutoff(t) {}
         bool operator() (const T & v) { return v > cutoff; }
    };

 

    这里,一个值(V)作为函数参数传递,而第二个参数(cutoff)是由类构造函数设置的。有了该定义后,就可以将不同的tooBig对象初始化为不同的取舍值,供调用remove_if()时使用:
    scores.remove_if(tooBig<int>(200));

    函数符(tooBig<int>(200))是一个匿名对象,它是由构造函数调用创建的。

 

拓展设计

    假设已经有了一个接受两个参数的模板函数:
    template <class T>
    bool tooBig (const T & val, const T & lim)
    { return val > lim; }

 

    则可以使用类将它转换为单个参数的函数对象:
    template <class T>
    class TooBig2
    { private:
         T cutoff;
      public:
         tooBig (const T & t): cutoff(t) {}
         bool operator() (const T & v) { return tooBig<T> (v,cutoff); }
    };

 

    即可以这样做:
    TooBig2<int> tB100(100);
    int x;
    cin >> x;
    if (tB100(x))
          // same as if ( tooBig(x,100) )
        ...

    类函数符TooBig2是一个函数适配器,使函数能够满足不同的接口。

 

预定义的函数符

    STL定义了多个基本函数符,它们执行诸如将两个值相加、比较两个值否相等操作。

 

    例如,考虑函数transform()。它有两个版本。第一个版本接受4个参数,前两个参数指定容器区间的迭代器,第三个参数是指定将结果复制到哪里的迭代器,最后一个参数是一个函数符,它被应用于区间中的每个元素,生成结果中的新元素:

    const int LIM = 5;
    double arr1[LIM] = {36,39,42,45,48};
    vector<double> gr8(arr1,arr1+LIM);
    ostream_iterator<double,char> out (cout," ");
    transform(gr8.begin(),gr8.end(),out,sqrt);

    上述代码计算每个元素的平方根,并将结果发送到输出流。目标迭代器也可以位于原始区间中。

    例如将上述范例中的out替换为gr8.begin()后,新值将覆盖原来的值。

 

    第二个版本使用一个接受两个参数的函数,并将该函数用于两个区间中的元素。它用另一个参数(即第3个)标识第二个区间的起始位置。
    例如,如果m8是另一个vector<double>对象,mean(double,double)返回两个值的平均值,则下面的代码将输出来自gr8和m8的值的平均值:
    transform(gr8.begin(),gr8.end(),m8.begin(),out,mean);

 

    对于所有内置的算术操作符、关系操作符和逻辑操作符,STL都提供了等价的函数符。

    下图列出了这些函数符的名称。它们可以用于处理C++内置类型或任何用户定义类型(如果重载了相应的操作符)。

 

 

操作符和相应的函数符

 


    例如使用plus<>()。它在头文件functional中定义。
    #include <functional>
    ...
    plus<double> add;
            // create a plus<double> object
    double y = add(2.2,3.4);   // using plus<double>::operator()()

 

    将它用作函数符:
    transform(gr8.begin(),gr8.end(),m8.begin(),out,plus<double>());

    这里没有创建命名的对象,而是用plus<double>构造函数构造了一个函数符,括号表示调用默认的构造函数。

 

自适应函数符和函数适配器

    上图列出的预定义函数符都是自适应的。STL有5个相关的概念:
    自适应生成器   (adaptable generator)
    自适应一元函数 (adaptable unary function)
    自适应二元函数 (adaptable binary function)
    自适应断言     (adaptable predicate)
    自适应二元断言 (adaptable binary predicate)

 

    使函数符成为自适应的原因是,它携带了标识参数类型和返回值类型的typedef成员。这些成员分别是result_type、first_argument_type和second_argument_type。

    例如,plus<int>对象的返回值类型被标识为plus<int>::result_type,这是int的typedef。

 

    函数符自适应性的意义在于:函数适配器对象可以使用函数对象,并认为存在这些typedef成员。
    例如,接受一个自适应函数符参数的函数可以使用result_type成员来声明一个与函数的返回值类型匹配的变量。

 

    STL提供了使用这些工具的函数适配器类。例如,假设要将矢量gr8的每个元素都增加2.5倍,则需要使用接受一个一元函数参数的transform()版本。multiplies()函数符可以执行乘法,但它是二元函数。因此需要一个函数适配器,将接受两个参数的函数符转换为接受一个参数的函数符。STL使用binderlst和binder2nd类自动完成这一过程,它们将自适应二元函数转换为自适应一元函数。

 

    假设有一个自适应二元函数对象f2(),则可以创建一个binderlst对象,该对象与一个将被用作f2()的第一个参数的特定值(val)相关联:
    binderlst (f2,val) f1;

    使用单个参数调用f1(x)时,返回的值与将val作为第一参数、将f1()的参数作为第二参数调用f2()返回的值相同。

 

    STL提供了函数bindlst(),以简化binderlst类的使用。可以用其提供用于构建binderlst对象的函数名称和值,它将返回一个这种类型的对象。
    例如,要将二元函数multiplies()转换为将参数乘以2.5的一元函数,则可以:
    bindlst (multiplies<double>(), 2.5)

 

    因此,将gr8中的每个元素与2.5相乘,并显示结果的代码如下:
    transform(gr8.begin(), gr8.end(), out,
         bindlst (multiplies<double>(), 2.5) );

 

    binder2nd类与此类似,只是将常数赋给第二个参数,而不是第一个参数。它有一个名为bind2nd的助手函数,该函数的工作方式类似于bindlst。

谱方法学习笔记-下(超详细) 《谱方法学习笔记》深入介绍了傅立叶谱方法在解决偏微分方程问题中的理论和实践,提供了清晰的步骤、Matlab代码以及对一维、二维波动方程等不同问题的解析,适合对谱方法感兴趣的学习者。 阅读详情

相关推荐

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。分别对LANDSAT 5/7/8系列数据计算FVC,其中Landsat5 和Landsat 7NDVI计算利用 B4和B3波段,Landsat8 和Landsat9 NDVI计算利用 B5和B4波段。算法从当年所有观测数据中,以低云、低探测角度和最高NDVI值为标准,选择最佳的可用像元值,并进行换算。(3) FVC的计算。

地球资源数据云的官方博客 1808

STL中的 函数对象

1、函数对象 2、谓词 3、内建函数对象

qq_24472227的博客 1074

【无人机设计与控制】基于PID控制的四旋翼无人机系统Matlab仿真

本文设计并仿真了基于PID控制的四旋翼无人机系统。首先,建立了四旋翼无人机的数学模型,涵盖了无人机的动力学和控制系统。通过PID控制器对四旋翼的姿态和位置进行控制,以实现其稳定飞行。使用MATLAB/Simulink对该系统进行仿真,验证了PID控制算法在四旋翼控制中的有效性。仿真结果表明,PID控制能够较好地调节四旋翼的飞行姿态,并有效抑制外部干扰,使得无人机能够保持平稳飞行。

2401_84610415的博客 1804

STL-函数对象

本质:函数对象(仿函数)是一个类,不是一个函数。

m0_64703222的博客 1188

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

【AI Infra】Perfetto性能分析工具指南

Perfetto是一款开源性能分析工具,提供系统级和应用级的活动数据追踪功能。其界面分为四个区域:左侧操作区(包含Trace查看、SQL查询、预置分析等功能)、上方信息区、中间图形化展示区以及下方详细信息区。工具支持快捷键操作(w/s缩放、a/d移动、m标记等),并能高效处理大体积Trace文件。通过Timeline分析可发现性能瓶颈,如案例中update_actor耗时过高的问题,最终定位到CPU offloading导致的MemcpyH2D操作耗时过长,提出了优化方案。Perfetto相比Systrac

baiweizeng的博客 1503

[C++]STL-函数对象基础知识

函数对象(仿函数) 重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样被调用 注意: 函数对象(仿函数)是一个类,不是一个函数 假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,就称其为“一元仿函数(unary fun...

renboyu010214的博客 756

R语言下载包报错?可能是IE浏览器在搞鬼!手把手教你修复(附CRAN镜像选择指南)

本文深入解析了R语言下载包时常见的网络报错问题,特别是Windows系统中因Internet Explorer代理设置导致的连接失败。文章提供了从重置IE配置、排查防火墙到优化CRAN镜像选择的完整解决方案,并附有详细的配置指南和自动化诊断脚本,帮助用户彻底解决R包安装难题。

weixin_29056781的博客 741

C++入门基础教程(十):STL函数对象

博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读。这是本系列最后一篇博文,希望大家多多点赞支持,谢谢。

总结论文中的算法并给出论文的复现代码 1223

26、机器学习模型的成员推断攻击与隐私保护

本文探讨了机器学习模型面临的成员推断攻击及其对隐私的潜在威胁。通过使用CIFAR-10数据集,详细介绍了如何利用影子模型和攻击模型推断特定数据点是否属于模型的训练集。实验表明,即使无法直接访问模型参数和原始数据,攻击者仍能以高于随机猜测的概率进行推断,从而构成隐私风险。此外,文章还分析了实验的关键技术点,并提出了多种隐私保护建议,包括数据脱敏、差分隐私、模型正则化等方法。

coffee的博客 123

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2871

stl 常用数学函数

目录1、计算绝对值2、计算某数的给定次幂3、计算平方根4、计算立方根5、计算正弦6、计算余弦7、计算正切8、计算反正弦9、计算反余弦10、计算反正切11、计算整数相除的商和余数12、返回两个浮点数的较大者13、返回两个浮点数的较小者14、计算两个浮点数的正数差 1、计算绝对值 计算整数的绝对值: //定义 int abs( int n ); long abs( long n ); long long abs( long long n ); //用法 int main() { int

滴水穿石的博客 1442

使用Simulink进行基于IIR滤波器的设计与稳定性分析仿真

IIR滤波器的稳定性与其系统函数的极点位置密切相关。如果所有极点都位于Z平面的单位圆内,则该滤波器是稳定的;否则,滤波器将是不稳定的。在设计IIR滤波器时,确保其稳定性对于避免输出信号发散至关重要。明确你的系统需求,比如输入信号类型(如正弦波)、采样率、IIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通IIR滤波器,用来去除高于500Hz的所有频率成分,保留低于500Hz的信号成分。采样率为8kHz。

xiaoheshang_123的博客 150

【C++】STL标准模板库与函数符(函数对象)

匿名函数(Lambda表达式):没有函数名字C++规则:bool compare(int n) //一元谓词函数改写成Lambda表达式返回值 [](形参) { 函数源码 }返回值bool类型,省略Lambda的好处作用:普通函数必须要有声明和定义,无论程序员是否调用该函数,该函数都是要占用系统资源的(Lambda表达式是需要的时候直接写在调用的位置,不需要就不存在)#include <list> //list的头文件/*C++中的函数符(函数对象)包括如下几种情况。

qq_62917398的博客 646

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++基础语法:STL之函数对象(二)_预定义的函数符

"打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.本书P710中间16.5.2STL定义了多个基本函数符,它们执行诸如将两个值相加、比较两个值是否相等操作。提供这些函数对象是为了支持将函数作为参数的STL函数。例如,考虑函数transform( )。它有两个版本。

jllws1的博客 1047

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ STL之函数对象/函数符(C++ primer,P707)

主要内容: 函数符的概念 预定义的函数符 函数符的概念 函数符是可以以函数的方式与 () 结合使用的任意对象(此处对象不仅指类对象); 函数名、指针、重载了 () 运算符的类对象都是函数符; 函数符概念: 生成器:不用参数即可调用的函数符; 一元函数:用一个参数就能调用的函数符; 二元函数:用两个参数可以调用的函数符; 谓词:返回 bool 值的一元函数; 二元谓词:返回 bool 值的二元...

pix_csdn的博客 362

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STL算法之函数对象(函数符)基本用法

函数符是通过重载小括号(),即operator()来实现的,声明和定义跟重载operator+等运算符类似。 函数符概念定义如下: 生成器(generator):不用参数就可以调用的函数符; 一元函数(unary function):用一个参数就可以调用的函数符(比如for_each(),每次用于一个容器元素); 二元函数(binary function):用两个参数就可以调用的函数符;...

净无邪博客 628

C++函数对象

很多STL算法都是用函数对象,也叫函数符(functor)。函数符是可以以函数方式与()结合使用的任意对象。public://重载()运算符Linear f1;//Linear对象//Linear对象//调用重载的()//调用重载的()通常第三个参数可以是常规函数,也可以是函数符。实际上这里提出一个问题:如何声明第三个参数?不能把它声明为函数指针,因为函数指针指定了参数类型。由于容器可以包含任意类型,所以无法预先知道使用那种类型。

weakenCoder的博客 1015

C++的函数对象(函数符)

C++的函数对象(函数符)

little_startoo的博客 355

泛型编程——函数对象

  很多STL算法都使用函数对象——也叫函数符。函数符是可以以函数方式与()结合使用的对象。这包括函数名,指向函数的指针和重载了()运算符的类对象。 class Linear { double slope; double y0; public: Linear(double sl_ = 2, double y_ = 0) : slope(sl_), y0(y_) {} double operator()(double x){return y0 + slope * x;} } 重载的()运算符将

qq_15973903的博客 257

C++——仿函数(函数对象,函数符)

函数符,函数对象,函数适配器的概念和一些基本使用方法

JAN6055的博客 1474

C++ day 39 函数对象(也叫函数符)

文章目录

wulimmya的博客 383

C++ 函数符

一,什么是函数符? 函数对象也叫函数符,函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象。 二,使用重载了()运算符的类对象

个人技术博客 2677

函数对象(函数符)

函数对象(函数符) 很多STL算法都使用函数对象,也叫函数符(functor)。函数符是以函数方式与( )结合使用的任意对象,如函数名、指向函数的指针、重载了( )运算符的类对象 函数符概念 1.生成器(generator)是不用参数就可以调用的函数符 2.一元函数(unary function)是用一个参数可以调用的函数符 3.二元函数(binary function)是用两个参数可以

1309

【C++笔记】二十、标准模板库(STL)(下)

1.函数对象 #include <iostream> #include <list> using namespace std; bool removeFunction(int n) { if(n < 4) { return true; // 删除比4小的值 } else { return false; } } void out(int n) { cout << n &lt

段昊东的博客 135

C++基础语法:STL之函数对象(一)

"打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.本书P707很多STL算法都使用函数对象——也叫函数符(functor)。函数符是可以以函数方式与( )结合使用的任意对象。这包括函数名指向函数的指针和重载了( )运算符的类对象(即定义了函数operator( )( )的类)。(黑体字是本书原话)红色部分是函数对象的定义,简而言之可以使用()运算符的对象,包括函数,函数指针,重载了()运算符的类对象.前面帖子。

jllws1的博客 796
上一篇: STL 之 multimap联合容器范例
下一篇: STL 之 算法
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值