仿函数的简单操作

#include<iostream>
#include<vector>
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
class C_Print
{
public:
	void operator()(int &ele)
	{
		cout << ele << endl;
	}
};


class C_Add
{
private:
	int m_ele;
public:
	C_Add(int value)
	{
		m_ele = value;
	}
	void operator()(int &value)
	{
		value += m_ele;
	}

};


void PrintElem(int elem, const char* prefix)
{
	cout << prefix << elem << endl;
}

void Print(int ele)				//必须有一个形参
{
	cout << ele << endl;
}
int main()
{
	int iArr[] = { 1,2,3 };
	vector<int> myVec(iArr, iArr + sizeof(iArr) / sizeof(iArr[0]));
	cout << "调用全局函数传入两个参数" << endl;
	for_each(myVec.begin(), myVec.end(), bind2nd(ptr_fun(PrintElem),"Element:a"));//需要转成function object
	for_each(myVec.begin(), myVec.end(), Print);	//不需要加括号了,因为调用的是全局函数,不是()重载函数
	cout << "不传入参数" << endl;
	for_each(myVec.begin(), myVec.end(), C_Print());
	cout << "传入一个参数(传入的参数用于初始化类中的成员变量了)" << endl;
	for_each(myVec.begin(),myVec.end(),C_Add(2));	
	//解析:
	/*
		for_each(myVec.begin(),myVec.end(),C_Add(2));
		该函数是怎么调用的??
		首先调用C_Add类的构造函数,将2赋值给类中的成员变量m_ele,然后才是调用operator() 
		重载函数,将一个个对象作为函数的实参传给重载函数的形参,然后在函数中进行操作才
		导致改变了原来数据中的值



	*/
	for_each(myVec.begin(), myVec.end(), C_Print());
	system("pause");
}

/*
	只要使用for_each(first,last,fun) 第三个参数的函数定义必须有一个参数,调用的时候可以不进行传参
	如果调用的是全局函数也可以不写()括号,只写一个函数名就可以了
	因为for_each(first,last,fun) 中的隐式的就将first到last中的每一个值当做了实参进行传入函数中了

	如果调用的是仿函数(也就是类中的对()括号进行重载的函数),那么就必须加上括号,如果构造函数需要传参
	那么调用的时候也需要写实参,实参的目的是赋给构造函数中的形参,并不是传给仿函数中的形参
	仿函数中的形参是由一个个的对象隐式传递的
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值