如何在C++ STL中使用Binder和Bind2nd函数对象
在C ++中,函数对象(也称为函数类)是可以像函数一样使用的对象。它们可以被称为函数,但它们还可以具有内部状态,可以像任何其他对象一样传递。当您希望将函数作为参数传递给另一个函数,但是您希望该函数具有一些其他上下文或状态时,这可能非常有用。
在C ++中创建函数对象的一种方法是定义一个类,该类重载了函数调用运算符(operator())。
例如:
class Add {
public:
Add(int x) : x_(x) {}
int operator()(int y) { return x_ + y; }
private:
int x_;
};
这个函数对象类 Add 在其构造函数中使用整数作为参数,并将其存储为内部状态。它重载了函数调用运算符,因此当使用整数参数调用 Add 对象时,它返回其内部状态和参数的总和。
以下是如何使用此函数对象的示例:
Add adder(5);
//现在 z 为 8
int z = adder(3);
在此示例中,我们创建了一个内部状态为5的 Add 对象,然后使用参数3调用它。 调用 adder(3) 等价于调用 adder.operator()(3),它返回5和3的和,即8。
binder是C++标准模板库(STL)中的函数模板,允许您创建将特定参数绑定到二元函数的函数对象。 Bind2nd的函数模板是binder的一种特定实例,将二元函数的第二个参数绑定到特定值。
以下是如何使用 bind2nd 创建一个将其参数乘以10的函数对象的示例:
#include <functional>
//返回值为50
std::bind2nd(std::multiplies<int>(), 10)(5)
在此示例中,我们使用 bind2nd 创建一个将其参数乘以10的函数对象。 然后,我们使用参数5调用此函数对象,它返回5*10的结果,即50。
示例1: 使用函数对象类添加两个数字
// C++程序示例,演示使用函数对象类添加两个数字。
#include <iostream>
// 创建Add类
class Add {
public:
//构造函数使用一个整数值作为functor的内部状态
Add(int x)
: x_(x)
{
}
// 重载函数调用运算符,将其内部状态添加到参数。
int operator()(int y) { return x_ + y; }
private:
int x_;
};
// 主函数
int main()
{
// 创建一个内部状态为5的Add函数对象
Add adder(5);
// 使用3作为参数调用函数对象,返回5和3的和
int z = adder(3);
std::cout << "z: " << z << std::endl;
return 0;
}
输出:
z: 8
示例2: 使用 bind2nd 创建一个将其参数乘以10的函数对象
// C++程序示例,演示使用bind2nd创建将其参数乘以10的函数对象。
#include <functional>
#include <iostream>
// 主函数
int main()
{
// 使用bind2nd创建将其参数乘以10的函数对象
auto multiplier
= std::bind2nd(std::multiplies<int>(), 10);
// 使用参数5调用函数对象,返回5*10的结果
int x = multiplier(5);
std::cout << "x: " << x << std::endl;
return 0;
}
输出
x: 50
示例3: 使用bind函数创建一个函子,将一个固定值从其参数中减去。
// 演示如何使用bind函数创建函子,
// 将一个固定值从其参数中减去。
#include <functional>
#include <iostream>
// 主函数
int main()
{
// 利用bind函数创建一个实例,
// 减去的固定值为5。
std::binder1st<std::minus<int> > subtraction(
std::minus<int>(), 5);
// 调用函子,将10作为参数,
// 返回5-10的结果。
int y = subtraction(10);
std::cout << "y: " << y << std::endl;
return 0;
}
输出
y: -5
时间复杂度: O(1)。
辅助空间: O(1)。