/************************************************************************
* ´úÂë±êÇ© : algorigthm ÖеÄfor_each map reduce µÈµÄʵÏÖ ½øÐк¯Êýʽ±à³Ì;
* ¹¦ÄÜÃèÊö :
* Àà Ãû ³Æ :
* °æ ±¾ ºÅ : v1.0
* ˵ Ã÷ :
* ×÷ Õß : dragonfive
* ´´½¨Ê±¼ä :
* ¸üÐÂʱ¼ä :
************************************************************************
* Copyright @dragonfive 2016 . All rights reserved.
************************************************************************/
#include
#include
#include
using namespace std;
//ÏÂÃæÊǺ¯Êýʽ±à³ÌÀïÃæµÄfor_each
template
void for_each(Collection const &collection,Func func)
{
std::for_each(collection.begin(),collection.end(),func);
}
//ÏÂÃæÊǺ¯Êýʽ±à³ÌÀïÃæµÄmap,ÒòΪc++µÄfor_each²»ÔÊÐí¶ÔÏó±»ÐÞ¸Ä,ËùÒÔÕâÀïʹÓÃtransform
//map²Ù×÷±íʾ¶ÔÈÝÆ÷ÖÐÿ¸öÔªËØ¶¼Ö´ÐÐÏàͬµÄ²Ù×÷
template
Collection map(Collection col,unop op)
{
std::transform(col.begin(),col.end(),col.begin(),op);
return col;
}
//transformʵÏÖreduce
//ÕâÀïµÄ²ÎÊýÊǸ´ÖƹýÀ´µÄ£¬ËùÒÔÔÚº¯ÊýÀïÃæÐÞ¸ÄcolÈÝÆ÷,²¢²»Ó°ÏìÔʼÊý¾Ý;
template
auto reduce(Collection col,binop op)
{
//Collection result(col.size());
std::transform(col.begin(),col.end()-1,col.begin()+1,col.begin()+1,op);
return *(col.end()-1);
}
//zip²Ù×÷±íʾ¶ÔÁ½¸öÈÝÆ÷ÖжÔÓ¦ÔªËØÖ´ÐвÙ×÷£¬½á¹û·µ»Ø;
template
Collection zip(Collection fc,Collection sc,binop op)
{
//Collection result(fc.size());
std::transform(fc.begin(),fc.end(),sc.begin(),fc.begin(),op);
return fc;
}
// exists ±íʾÅжϼ¯ºÏÖÐÊÇ·ñÓÐij¸öÔªËØ·ûºÏÌõ¼þ;
template
bool exists(Collection col,Condition con)
{
auto exist = std::find_if(col.begin(),col.end(),con);
return exist != col.end();
}
//ºÍmap()ÀàËÆ£¬filter()Ò²½ÓÊÕÒ»¸öº¯ÊýºÍÒ»¸öÐòÁС£
//ºÍmap()²»Í¬µÄÊÇ£¬filter()°Ñ´«ÈëµÄº¯ÊýÒÀ´Î×÷ÓÃÓÚÿ¸öÔªËØ£¬
//È»ºó¸ù¾Ý·µ»ØÖµÊÇTrue»¹ÊÇFalse¾ö¶¨±£Áô»¹ÊǶªÆú¸ÃÔªËØ¡£
template
Collection filterNot(Collection col,Predicate predicate )
{
auto returnIterator = std::remove_if(col.begin(),col.end(),predicate);
col.erase(returnIterator,std::end(col));
return col;
}
template
Collection filter(Collection col,Predicate predicate)
{
auto fnCol = filterNot(col,[predicate](typename Collection::value_type i) { return !predicate(i);});
return fnCol;
}
int main()
{
//helper println
auto println = [](const char *message){ std::cout << message << std::endl;};
auto lambda_echo = [](int i ) { std::cout << i << std::endl; };
std::vector col{20,24,37,42,23,45,37};
//ÓÃfor_eachÀ´¶ÔÈÝÆ÷ÖÐÿ¸öÔªËØ½øÐÐÊä³ö;
println("running foreach");
for_each(col,lambda_echo);
// ÓÃmapÀ´¶ÔvectorÖÐÿ¸öÔªËØ+1
println("running map operation");
auto addOne = [] (int i) { return i+1;};
auto returnCol = map(col,addOne);
for_each(returnCol,lambda_echo);
//ÕâÀïÓÃreduceÀ´ÈÏΪvectorÿһλÊÇÒ»¸ö´óÊý ;
println("running reduce operation");
auto reduceAdd = [] (int a, int b){ return a+b;};
int bigNum = reduce(col,reduceAdd);
cout<<"reduce add result:"< secondCol{40,22,22,24,23,45,34};
auto zipCol = zip(col,secondCol,zipAdd);
for_each(zipCol,lambda_echo);
println("runnig exists");
//prints 1 if true 0 if false
std::cout << "value 20 exist= " << exists(col, [] (int value){ return value==20;}) << std::endl;
std::cout << "value 43 exist= " << exists(col, [] (int value){ return value==43;}) << std::endl;
println("running filterNot");
auto filterCol = filterNot(col,[](int value){ return value==23;});
for_each(filterCol,lambda_echo);
println("running filter");
auto filteredCol = filter(col,[](int value){ return value > 30;});
for_each(filteredCol,lambda_echo);
}