c++中的函数对象(Functor)是什么_仿函数定义与在STL算法中的应用

阿萱君_9388

阿萱君_9388

2025-11-07

677人浏览

原创

函数对象是重载了operator()的类实例,可像函数一样调用并能携带状态。例如add结构体重载operator()实现加法,counter通过成员变量记录调用次数,体现其状态保持能力。相比函数指针,函数对象性能更高且支持泛型编程。stl算法如sort、find_if广泛使用函数对象自定义逻辑,如greater实现降序排序。标准库还提供plus、less等预定义函数对象。c++11的lambda表达式本质上是编译器生成的匿名函数对象,如[ ](int a, int b){ return a*b; }简化了函数对象的创建与使用。函数对象作为泛型编程核心,提升了代码灵活性与效率。

c++中的函数对象(functor)是什么_仿函数定义与在stl算法中的应用

在C++中,函数对象(也称为仿函数,Functor)是指可以像函数一样被调用的对象。它本质上是一个类或结构体的实例,重载了函数调用运算符 operator(),从而允许该对象被当作函数使用。

什么是函数对象(Functor)

函数对象不是传统意义上的函数,而是一个定义了 operator() 的类对象。当这个对象被调用时,就像调用一个普通函数一样:

struct Add {
    int operator()(int a, int b) const {
   &;    return a + b;
   →}
};

Add add;
int result = add(3, 5); // 调用 operator(),结果为 8

上面的例子中,Add 是一个函数对象类型,add 是它的实例。通过重载 operator(),我们可以像调用函数一样使用 add(3, 5)

函数对象的优势

相比普通函数或函数指针,函数对象更灵活,主要体现在以下几个方面:

  • 可携带状态:函数对象可以在成员变量中保存数据,实现“有记忆”的调用行为。
  • 性能更高:编译器通常能对函数对象的调用进行内联优化,避免函数指针的间接调用开销。
  • 支持泛型编程:结合模板,函数对象可以适配多种数据类型。

struct Counter {
    int count = 0;
    void operator()() { ++count; }
    int getCount() const { return count; }
};

Counter c;
c(); c();
// c.getCount() 返回 2

这个例子展示了函数对象如何维护内部状态,这是普通函数难以实现的。

函数对象在STL算法中的应用

STL 中大量算法接受函数对象作为参数,用于自定义操作逻辑,例如排序、查找、遍历等。

常见用法包括:

Upload audio to AIOZ Stream
Upload audio to AIOZ Stream

快速上传音频至 AIOZ Stream API。支持默认或自定义编码配置创建音频对象,上传文件并完成处理后返回音频链接。

下载
  • 自定义排序规则:传递函数对象给 std::sort
  • 条件判断:用于 std::find_ifstd::count_if 等算法
  • 元素变换:配合 std::transform 实现数据映射

include

include

include stream>

struct Greater {
    bool operator()(int a, int b) const {
        return a > b;
    }
};

std::vector nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end(), Greater{}); // 降序排序

for (int n : nums) {
    std::cout }

这里将函数对象 Greater{} 传入 std::sort,实现了降序排列

此外,C++ 标准库还提供了一些预定义的函数对象,如 std::plusstd::lessstd::negate 等,位于 头文件中,可以直接使用。

lambda 表达式与函数对象的关系

C++11 引入的 lambda 表达式本质上会生成一个匿名的函数对象。例如:

auto multiply = [](int a, int b) { return a * b; };
int result = multiply(4, 5); // 调用 lambda

编译器会为这个 lambda 创建一个具有 operator() 的闭包类型对象,其行为与手写的函数对象一致,但写法更简洁。

基本上就这些。函数对象是 C++ 泛型编程的重要组成部分,理解它有助于更好地使用 STL 和编写高效、可复用的代码。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.12

2087

5

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

2291

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

474

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

402

19

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

5684

49

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2264

5

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

1552

13

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

2268

5

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1098

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind Quick Start Guide
Valgrind Quick Start Guide

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习