1. 仿函数与Lambda表达式概述
在C++编程中,函数对象(Functor)和Lambda表达式是两种强大的工具,它们让函数也能像普通对象一样被传递和使用。我第一次接触这个概念是在优化一个排序算法时,发现标准库的sort函数可以接受自定义比较函数,这彻底改变了我对C++函数用法的认知。
仿函数本质上是一个重载了operator()的类对象,而Lambda表达式则是C++11引入的匿名函数语法糖。它们共同解决了传统函数指针的局限性:可以携带状态(成员变量)、有明确的类型信息、并且支持内联优化。在实际项目中,这两种技术经常被用于STL算法、回调机制、多线程编程等场景。
注意:虽然Lambda表达式在C++11才正式加入,但现代C++项目(17/20标准)中已经普遍使用。如果你的编译器报错,请检查-std=c++11或更高版本的编译选项。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 仿函数深度解析
2.1 基本实现与使用
一个标准的仿函数实现如下:
cpp复制class Square {
public:
int operator()(int x) const {
return x * x;
}
};
// 使用示例
Square square;
cout << square(5); // 输出25
这里Square类通过重载operator(),让对象可以像函数一样被调用。相比普通函数,仿函数的优势在于:
- 可以保存状态(通过成员变量)
- 可以作为模板参数传递(函数指针不行)
- 编译器更容易做内联优化
2.2 带状态的仿函数实战
仿函数真正的威力在于其可以携带状态。假设我们需要一个累加器:
cpp复制class Accumulator {
int total = 0;
public:
int operator()(int x) {
total += x;
return total;
}
};
// 使用示例
Accumulator acc;
cout << acc(10); // 10
cout << acc(20); // 30
cout << acc(30); // 60
这种特性在STL算法中特别有用。比如生成斐波那契数列:
cpp复制vector<int> fibs(10);
generate(fibs.begin(), fibs.end(), Fibonacci());
2.3 STL中的仿函数应用
STL内置了许多常用仿函数,位于
- arithmetic: plus, minus, multiplies...
- comparison: equal_to, not_equal_to, greater...
- logical: logical_and, logical_or...
- bitwise: bit_and, bit_or...
使用示例:
cpp复制sort(vec.begin(), vec.end(), greater<int>()); // 降序排序
transform(a.begin(), a.end(), b.begi
