c++stl仿函数(functors, function objects)

引用c++标准函数库的定义:传递给算法的“函数型参数”,并不一定得是函数,可以是行为类似函数的对象,这种对象称为仿函数(一般速度比一般函数快)。
何为行为像个(类似)函数?:是指可以使用小括号传递参数,来调用某个东西。例如:
function(arg1,arg2);
1,一个简单例子

#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
#include<vector>
#include<stdlib.h>
using namespace std;


class print {
public:
	void operator()(int ele)const {
		cout << ele <<" ";
	}
};

class my_cmp1 {
public:
	bool operator()(const int &a, const int &b) {
		return a < b;
	}
};

struct my_cmp2 {
	bool operator()(const int &a, const int &b) {
		return a < b;
	}
};
int main() {
	vector<int> coll;//默认按升序
	for (int i = 9; i > 0; i--) {
		coll.push_back(i);
	}
	cout << "init: ";
	copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "));
	cout << endl;

	sort(coll.begin(), coll.end(), my_cmp2());//和使用my_cmp2()一个效果
	cout << "sorted: ";
	for_each(coll.begin(), coll.end(), print());
	cout << endl;

	system("pause");
	return 0;
}

上面的简单例子列举了仿函数的简单写法可以使一个类的public方法,也可以使一个结构体的方法,都要重载()。

2,加入需要对一个容器中的所有值进行加一个数,如果这个数是确定的,那么可以使用一般函数,如下两种方式

//方式一,使用lambda表达式,该语句加到上面程序的sort()函数下面
for_each(coll.begin(), coll.end(), [](int &a)->void{ a = a + 10; });
//之前声明函数,然后调用
void add10(int &a) {
	a = a + 10;
}
for_each(coll.begin(), coll.end(),add10);

如果要加的值不确定,而它们在编译期都已确定,可以使用template或类:

//使用template
#include<>
template <int thevalue>
void addvalue(int &ele) {
	ele += thevalue;
}
//之后调用,实现加100,或其他值
for_each(coll.begin(), coll.end(), addvalue<100>);
//使用类
#include<>
class Addvalue {
private:
	int thevalue;
public:
	Addvalue(int val):thevalue(val){}
	
	void operator()(int &ele)const {
		ele += thevalue;
	}
};
//调用使对应容器值加20
for_each(coll.begin(), coll.end(), Addvalue(20));

当然stl中也有预先定义的仿函数,比如常用的比较准则
set<int> col;中默认使用less<int>表示升序,全部不缺省为set<int,less<int> >; 也可以为greater<int>:降序;negate<int>:取相反数;multiplies<int>:取平方等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值