See More

/************************************************************************ * ´úÂë±êÇ© : 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); }