1.含有状态的函数对象类
函数对象类除了 operator()之外也可以包含其他成员。函数对象类通常含有一些数据成员这些成员被用于定制调用运算符中的操作。举个例子,我们将定义一个打印 string 的类。默认情况下,会将内容写入到cout 中,每个string之间以空格隔开。同时也允许类的用户提供其他可写入的流及其他分隔符。类定义如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Printstring//输出string的内容
{
public:
PrintString(charc=' '):sep(c){}//构造函数,默认为空格分隔void operator()(const string& s)const//重载()运算符
{
cout <<s<< sep;
}
//利用sep分隔
private:
char sep;
};
//用于分隔的字符
int main()
{
vector<string>v1 = {"china","Japan","Malaysia","singapore","India","German"};
Printstring p1;//使用默认值,输出一个元素后面跟空格
Printstring p2(',');//输出一个元素后面跟,
Printstring p3('*');//输出一个元素后面跟 *
for_each(v1.begin(),v1.end(),p1);//输出每个元素
cout << endl;
for_each(v1.begin(),v1.end(),p2);//输出每个元素
cout << endl;
for_each(v1.begin(),v1.end(),p3);//输出每个元素
cout << endl;
return 0;
}
2.库预定义的函数对象
使用内置的函数对象需要引用<functional>头文件
3.预定义函数对象的使用
greater
使用的非常多的一个函数对象。sort排序默认为升序,使用的是less小于,如果需要降序排序可以使用greater。
#include<vector>
#include<functional>
#include<algorithm>
#include<iostream>
using namespace std;
//输出vector的所有元素
template<typename T>
void Show(const vector<T>& v)
{
for(auto x:v)
cout << x<<" ";
cout << endl;
}
//自定义比较函数
bool Greater(int val1,int val2)
{return val1>val2;
}
int main()
{
vector<int>v1{3,1,8,9,0,2,5,7,10,23,12,45,33,11};
sort(v1.begin(),v1.end());
cout<<"默认排序:" <<endl <<" ";
Show(v1);
//下面三种方法效果一样,
sort(v1.begin(),v1.end(),greater<int>());//把大于greater函数对象传入sort
//sort(v1.begin(),v1.end(),Greater);//也可以传入自己定义的比较函数
//sort(v1.begin(),v1.end(),[](int val1,int val2){return val1 >va12;});//也可以使lamda表达式
cout<<"降序排序:" <<endl <<
11
Show(v1);
return 0;
}
negate
数据求负
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
//输出vector的所有元素
template<typename T>
void Show(const vector<T>& V)
{
for(auto x:v)
COUt << x<< "".
cout << endl;
}
int main()
{
vector<int>v1,v2(8);//创建一个空的v1和有8个空间的v2
for(inti=-3;i<5;i++)//插入数据,有正有负
v1.push back(i);
cout<<"v1:";Show(v1);//输出v1的元素
//把v1的数据全部求负,保存到v2中
transform(v1.begin(),v1.end(),v2.begin(),negate<int>());//transform:转换算法
cout<<"v2:";Show(v2);
return 0;
}