仿函数(函数对象)是STL中强大的抽象工具,允许将函数作为参数传递,同时保持状态和类型安全
仿函数(也称为函数对象)是重载了函数调用操作符operator()的类对象。它们可以像普通函数一样被调用,但具有状态,可以存储和传递数据。
#include <iostream>
// 自定义仿函数 - 加法器
class Adder {
public:
Adder(int num) : num_(num) {}
int operator()(int x) const {
return x + num_;
}
private:
int num_;
};
int main() {
Adder add5(5);
std::cout << "10 + 5 = " << add5(10) << std::endl; // 输出 15
Adder add10(10);
std::cout << "10 + 10 = " << add10(10) << std::endl; // 输出 20
return 0;
}
STL提供了内置的仿函数,同时允许用户自定义仿函数
plus, minus, multiplies, divides, modulus, negate
std::plus<int> add; int result = add(10, 20); // 30
equal_to, not_equal_to, greater, greater_equal, less, less_equal
std::greater<int> gt; bool result = gt(10, 5); // true
logical_and, logical_or, logical_not
std::logical_and<bool> and_op; bool result = and_op(true, false); // false
开发者根据需求定义的函数对象
class Square {
public:
int operator()(int x) const {
return x * x;
}
};
仿函数在STL算法中的应用
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> // 包含STL仿函数
// 自定义仿函数 - 平方
class Square {
public:
int operator()(int x) const {
return x * x;
}
};
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> squares(nums.size());
// 使用内置仿函数进行降序排序
std::sort(nums.begin(), nums.end(), std::greater<int>());
std::cout << "降序排序: ";
for (int n : nums) std::cout << n << " ";
// 使用自定义仿函数进行转换
std::transform(nums.begin(), nums.end(), squares.begin(), Square());
std::cout << "\n平方值: ";
for (int n : squares) std::cout << n << " ";
// 使用lambda表达式作为仿函数
int threshold = 10;
auto count = std::count_if(squares.begin(), squares.end(),
[threshold](int x) { return x > threshold; });
std::cout << "\n大于" << threshold << "的值数量: " << count;
return 0;
}
降序排序: 5 4 3 2 1 平方值: 25 16 9 4 1 大于10的值数量: 2