乐动体育(中国)最新官方入口

[指南]:在日常编码中,我们会找到一些功能代码,这些功能代码将在不同的成员函数中连续使用,但是将这些代码分成成员函数并不容易。

解决方案之一是编写一个公共函数,但是该函数使用的某些变量可能会变成全局变量。

此外,为了重用这样的一段代码,有必要创建一个单一的函数,该函数不是很容易维护。

此时,可以使用函子函数。

以下是在本文中引入函子的原因。

首先考虑一个简单的示例:假设有一个向量,并且您的任务是计算长度小于5的字符串数。

如果您使用count_if函数,您的代码可能会像这样增长:bool LengthIsLessThanFive(const string& str ){返回str.length()5; } int res = count_if(vec.begin(),vec.end(),LengthIsLessThanFive);其中count_if函数的第三个参数是函数指针,返回布尔类型的值。

通常,如果需要传递特定的阈值长度,我们可以编写如下函数:bool LenthIsLessThan(const string& str,int len){return str.length()len;}此函数看起来比以前的版本更好它更通用,但不能满足count_if函数的参数要求:count_if需要一元函数(只有一个参数)作为其最后一个参数。

所以问题是,如何找到上述两个功能的折衷解决方案?该问题实际上可以归因于数据流问题。

为了设计这样的函数以使其可以访问该特定长度值,并回顾我们的现有知识,有三种解决方案要考虑:(1)函数的局部变量:局部变量不能在函数调用中传递,调用者不能在函数调用中传递。

访问。

(2)函数参数:我们已经讨论了此方法,并且多个参数不适用于count_if函数。

(3)全局变量:我们可以将长度阈值设置为全局变量,代码可能如下所示:int maxLength; bool LengthIsLessThan(const string& str){return str.length()} int res = count_if(vec。

begiin(),vec.end(),LengthIsLessThan);该代码看起来非常不错,但是不符合规范,更重要的是,它并不优雅。

需要考虑以下几个原因:(1)容易出错:为什么要这样说,我们必须先初始化maxLength的值,然后才能继续进行下一个工作,如果我们忘记了,则可能无法获得正确的答案。

另外,变量maxLength和函数LengthIsLessThan之间没有必要的连接,并且编译器无法在调用函数之前确定是否初始化变量,这给程序员带来了负担。

(2)无可伸缩性:如果每次遇到类似的问题时都创建一个新的全局变量,尤其是当多个人一起编写代码时,很容易造成名称空间污染的问题;当有很多变量时,我们可能不会使用我们想要的变量。

(3)全局变量的问题:每当创建新的全局变量时,即使为了方便编码,我们也需要知道我们应该尽可能少地使用全局变量,因为它的成本很高;可能意味着您有一些要解决的优化计划。

函子简介说了这么多,我们仍然必须回到最初的问题。

有什么解决方案?答案当然是该博客的主要主题:函子。

我们的初衷是设计一个一元函数,以便它可以执行二元函数。

这似乎并不容易,但是函子可以解决此问题。

让我们首先看一下函子的流行定义:函子(也称为函数对象)是可以执行函数功能的类。

functor的语法与普通函数调用的语法几乎相同,但作为functor的类,必须重载operator()运算符,例如:class Func {public:void operator()(const string& str)const {coutendl ; Func myFunc; myFunc(“ helloworld!”)); >>> helloworld!函子实际上是上述解决方案中的第四个解决方案:成员变量。

成员函数自然可以访问成员变量:类StringAppend {公共:显式StringAppend(const string& str):ss(str){} void运算符()(const string& str)const {cout}私有:const string ss; }; StringAppend myFunc(“是世界”); myFunc(“ hello”); <>> hellois世界我相信这个例子会让您对小函子的功能有所了解;它可以像普通函数一样传递给定的数量参数也可以存储或处理我们需要的更多有用信息。

让我们回到count_if问题,您认为问题突然变得清楚了吗? class ShorterThan {public:显式ShorterThan(int maxLength):length(maxLength){} bool operator()(const string&