#include <algorithm>
#include <vector>
#include <iostream>
#include <functional >
#include <iterator>
using namespace std;
void printV(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
}
void showEl(int &n)
{
cout << n << " ";
}
class MyShow
{
public:
MyShow()
{
num = 0;
}
void operator()(int &n)
{
num++;
cout << n << " ";
}
void Print()
{
cout << num << " ";
}
private:
int num;
};
void foreach_()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
//第三个参数可传入函数对象或回调函数的入口地址,一般函数对象的参数为引用,没有返回值
for_each(vec.begin(), vec.end(), showEl);
cout << endl;
for_each(vec.begin(), vec.end(), MyShow());
cout << endl;
/*
template<class _InIt,
class _Fn> inline
_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func)
{ // perform function for each element [_First, _Last)
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
for (; _UFirst != _ULast; ++_UFirst)
{
_Func(*_UFirst);
}
return (_Func);
}
*/
//for_each返回一个函数对象
MyShow my1;
MyShow my2 = for_each(vec.begin(), vec.end(), my1);
cout << endl;
my1.Print();
cout << endl;
my2.Print();
cout << endl;
}
int ADD(int n)
{
return n + 10;
}
void transform_()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
vector<int> vec2;
vec2.resize(vec.size());
//transform:将vec中的每个元素+10后存放到vec2中
//使用回调函数 必须有返回值,一般不使用引用
transform(vec.begin(), vec.end(), vec2.begin(), ADD);
printV(vec2);
cout << endl;
//使用预定义函数对象
transform(vec.begin(),vec.end(),vec2.begin(),negate<int>());//取反
printV(vec2);
cout << endl;
//使用预定义函数对象和函数适配器
transform(vec.begin(), vec.end(), vec2.begin(), bind2nd(multiplies<int>(), 10));//将每个元素*10
printV(vec2);
cout << endl;
//直接输出,使用ostream_iterator输出流迭代器
//ostream_iterator:第一个参数:输出到那个缓冲区,第二个参数:输出间距
transform(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), negate<int>());//
cout << endl;
}
void main()
{
foreach_();
transform_();
system("pause");
}
for_each使用函数对象,一般函数对象的参数为引用,没有返回值,transform使用函数对象,必须有返回值,一般不使用引用
for_each速度快,不灵活,transform速度慢,非常灵活