谈谈c++的仿函数(或称函数对象)

  • 缘起:在c++ STL中泛型算法for_each()的使用中提到了仿函数的使用,这里从实例的角度出发,分析c++ 中的仿函数。
  • 定义及使用方式:c++ 仿函数(仿函数不仅在c++ 语言中有,如Java)即为类对象能像函数那样调用使用,因此又称为函数对象。c++中通过在类的定义中重载()运算符实现。
  • 注意:仿函数在使用时与构造函数本质的区别是:构造函数是在声明(定义)类对象的时候调用;而仿函数是定义好的类对象上进行(重载)调用。
  • 使用仿函数的好处:任何事物的出现都有其必要性,那么仿函数出现的好处是:通过仿函数在同一个类中拥有两种不同状态的对象。在实例二中说明。
  • 实例1
#include<iostream>
using namespace std;

template <class T>
class Say {
public:
	void operator()(T a)
	{
		cout << a << endl;
	}
};

template<class T>
void allFunc(int arr[], int len, T func)
{
	for (int i = 0; i < len; i++)
		func(arr[i]);
}

int main()
{
	int arr[5] = {1, 2, 3, 4, 5};
	allFunc<Say<int>>(arr, 5, Say<int>());
	system("pause");
	return 0;
}

上面实例中在main函数的allFunc()函数的调用中,通过Say()构造无名的Say对象,并将其以参数传入allFunc中通过()重载函数以仿函数的方式进行访问。

  • 实例2
#include<iostream>
using namespace std;

template<class T>
class Functor {
public:
	enum Type{plus, sub};
	Functor(Type t = plus) :type(t) {}
	T operator()(T a, T b)
	{
		if (this->type == plus)//type == plus也可,默认是当前对象的type成员
			return a + b;
		else
			return a - b;
	}
public:
	Type type;
};

int main()
{
	Functor<int> plu(Functor<int>::plus);
	Functor<int> su(Functor<int>::sub);

	cout << plu(3, 2) << endl;
	cout << su(3, 2) << endl;
	system("pause");
	return 0;
}

如上面实例2所示,通过在构造函数中传入不同的变量值从而可以构建不同状态(功能)的实例,通过仿函数的形式对实例进行执行不同的功能。

在++中,与迭代器密切相关的STL函数有很多。这些函数允许我们在容器中进行迭代和操作,提供了方便且高效的方法来处理容器中的元素。以下是一些与迭代器密切相关的常用std函数: 1. `std::begin` 和 `std::end`:这两个函数用于获取容器的起始迭代器和结束迭代器。例如,`std::begin(container)` 返回容器 `container` 的起始迭代器,`std::end(container)` 返回容器的结束迭代器。 2. `std::advance`:该函数用于将迭代器向前或向后移动指定的距离。例如,`std::advance(it, n)` 将迭代器 `it` 向前移动 `n` 个位置。 3. `std::distance`:该函数用于计算两个迭代器之间的距离。例如,`std::distance(first, last)` 返回从迭代器 `first` 到迭代器 `last` 之间的元素数量。 4. `std::next` 和 `std::prev`:这两个函数用于获取给定迭代器的下一个或上一个迭代器。例如,`std::next(it)` 返回 `it` 的下一个迭代器,`std::prev(it)` 返回 `it` 的上一个迭代器。 5. `std::advance` 和 `std::distance`:这两个函数通常结合使用,用于在迭代器范围内进行迭代。例如,`std::advance(first, n)` 可以将迭代器 `first` 向前移动 `n` 个位置,而 `std::distance(first, last)` 可以计算从迭代器 `first` 到迭代器 `last` 之间的元素数量。 6. `std::copy`:该函数用于将一个容器的元素复制到另一个容器中。它接受两个迭代器参数,表示源容器中要复制的范围,以及目标容器的起始位置。 7. `std::find`:该函数用于在容器中查找指定的值,并返回找到的第一个匹配元素的迭代器。 8. `std::sort`:该函数用于对容器中的元素进行排序。它接受两个迭代器参数,表示排序的范围。 9. `std::reverse`:该函数用于反转容器中元素的顺序。它接受两个迭代器参数,表示反转操作的范围。 这些只是一些常用的与迭代器密切相关的std函数,STL还提供了更多用于处理容器的函数和算法。使用这些函数,我们可以方便地遍历、操作和处理容器中的元素,提高代码的效率和可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值