什么是 C++ 函子及其用途?

2024-01-10

我不断听说 C++ 中的函子。有人能给我概述一下它们是什么以及它们在什么情况下有用吗?


函子几乎只是一个定义了operator()。这使您可以创建“看起来像”函数的对象:

// this is a functor
struct add_x {
  add_x(int val) : x(val) {}  // Constructor
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

函子有几个优点。一是与常规函数不同,它们可以包含状态。上面的示例创建了一个函数,它将 42 添加到您给它的任何值上。但值 42 不是硬编码的,它是在我们创建函子实例时指定为构造函数参数的。我可以创建另一个加法器,只需使用不同的值调用构造函数即可添加 27。这使得它们可以很好地定制。

正如最后几行所示,您经常将函子作为参数传递给其他函数,例如 std::transform 或其他标准库算法。您可以对常规函数指针执行相同的操作,但正如我上面所说,函子可以“自定义”,因为它们包含状态,使它们更加灵活(如果我想使用函数指针,我必须编写一个函数它在其参数中精确地添加了 1。仿函数是通用的,并添加您初始化它时使用的任何内容),并且它们也可能更有效。在上面的例子中,编译器确切地知道哪个函数std::transform应该打电话。它应该调用add_x::operator()。这意味着它可以内联该函数调用。这使得它就像我在向量的每个值上手动调用该函数一样高效。

如果我传递了一个函数指针,编译器将无法立即看到它指向哪个函数,因此除非它执行一些相当复杂的全局优化,否则它必须在运行时取消引用该指针,然后进行调用。

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

什么是 C++ 函子及其用途? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 当图像较小时,在引导模式中垂直对齐中心

    我正在使用引导模式来显示不同尺寸的图像 我希望模态主体具有最小的宽度和高度 实际上是 600 400 因此 当图像较大时 它会扩展并运行良好 但当图像的高度低于 400 像素时 图像会在顶部 垂直 对齐 所以我想将它垂直对齐在模态主体的中间
  • gwt 的日期时间库

    我正在开发一个 gwt 应用程序 其中涉及对日期时间的高级操作 从一个时区转换到另一个时区等 Gwt 有一些用于处理日期的低级内容 但它们对我来说太低级了 gwt 是否有类似于 joda time 或 Threeten 的选项 您可以查看以
  • 如何获取 Python OrderedDict 中的前 3 个元素?

    如何获取 Python OrderedDict 中的前 3 个元素 也可以从该字典中删除数据 例如 如何获取 Python OrderedDict 中的前 3 个元素并删除其余元素 让我们创建一个简单的OrderedDict gt gt g
  • Angular2 模板解析错误:嵌入模板上的任何指令均未使用属性绑定 ngFor

    这是 Angular2 模板
  • iPad Safari 忽略 html5 视频上方的 div onclick

    我在使 div 元素可点击时遇到问题 我在屏幕上有一个 HTML5 视频 在视频结束事件之后 我使用 z index 属性创建了一些位于视频上方的 div 元素 录制这个 div 时没有任何反应 但如果这个 div 不位于视频上方 则一切正
  • Java图形库[重复]

    这个问题在这里已经有答案了 我一直在这里寻找对用于图形可视化表示的 java 库的任何引用 但我只找到了直方图 饼图等的库 我正在寻找一个图形库 带有顶点 节点等的图形库 任何人都可以推荐吗 我会和JUNG http jung source
  • 开发人员如何制作 iOS Simulator 动画 .gif? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我经常在 GitHub 上看到很多这样的内容 如何重现这个 gif 动画效果 https github com autresphere A
  • 如何使 Dart 对象/类可索引?

    在Python中 我可以通过覆盖使任何类支持索引 getitem 像这样 class Test def getitem self key return self data key Dart 是否有类似的构造 假设 getitem thing
  • 如何查看哪些查询正在使用 MongoDB 中的索引?

    我看到 MongoDB 正在使用索引 但我不确定哪些查询正在使用它 如何查看哪些查询正在使用索引 编辑 为了澄清 我想看看哪个查询使用索引 而不是相反使用explain查看特定查询使用了哪些索引 您可以运行您的查询 解释 https doc
  • WinForm 滚动查看器

    我在 WPF 中有一个使用 ScrollViewr 的应用程序 我想将其移植到 WinForms WinForms 是否有等效的控件 Reason WPF 程序很慢 我似乎无法学习如何正确渲染程序 GameOfLife 代码
  • pdfMake - 无法打开文件

    我在 Nodejs 上使用了这个模块 https github com bpampuch pdfmake https github com bpampuch pdfmake 这是我创建它的代码 const fonts Roboto norm
  • C++11接口纯虚析构函数

    UPD 有一个标记表明它是重复的这个问题 https stackoverflow com questions 11494422 default pure virtual destructor 但在这个问题中 OP询问如何使用default定
  • 使用 Hystrix Spring Cloud 进行单元测试回退的任何示例

    我想测试以下场景 Set the hystrix command default execution isolation thread timeoutInMillisecond值设置为低值 然后查看我的应用程序的行为方式 使用单元测试检查我
  • 我怎样才能加快这个循环?是否有一个类可以同时替换多个术语?

    循环 var pattern dict key string before do before pattern foreach var pair in dict if key pair Key pattern pattern Replace
  • 自调整大小 UITableViewCell 内的多个 UILabel

    在我正在创建的这个 iOS 8 应用程序中 我有一个表格视图 我需要它们自动调整大小 我使用自动布局实现了它并且它有效 几乎 现在看起来是这样的 单元格内有 3 个标签 具有 lorem ipsum 文本的主标签 具有数字字符串的副标题 这
  • .click() 仅触发一次,之后不再触发,除非我刷新整个页面,并且如果我调用 $(document).ready() 则根本不渲染

    我正在尝试从 JSON 文件中检索引用及其作者 我遇到的问题是 一旦我单击按钮一次 事件就会被触发 但只会触发一次 此后不再触发 同样 当我调用 document ready 时 按钮根本不会触发 我知道这与我从 JSON 文件 是带有文本
  • 在 Yahoo! 中使用 OAuth API 请求 (Python)

    我正在尝试将应用程序与 Yahoo 集成需要 oauth 身份验证才能访问受保护数据的 api 我在用着python oauth2 https github com simplegeo python oauth2并按照雅虎列出的步骤进行操作
  • 如何在 Rails 3.2.20 中强制 Cache-Control 不存储

    有几个S O 诸如此类的问题 Rails set no cache方法 无法禁用Safari和Opera中的浏览器缓存 https stackoverflow com questions 10744169 rails set no cach
  • Firebase Firestore 新行命令

    我正在尝试使用新行命令在文本中创建新行 从这个问题来看 这是不可能的 新行命令 n 不适用于 Firebase Firestore 数据库字符串 https stackoverflow com questions 48755746 new
  • 什么是 C++ 函子及其用途?

    我不断听说 C 中的函子 有人能给我概述一下它们是什么以及它们在什么情况下有用吗 函子几乎只是一个定义了operator 这使您可以创建 看起来像 函数的对象 this is a functor struct add x add x int