泛型算法中的定制操作
许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作。
- 普通排序算法:
template<class RandomIterator> void sort(RandomIterator first,RandomIterator last){ if(first >= last || first + 1 == last) return; if(last - first <= 20) return bubble_sort(first,last,pred); auto mid = mid3(first,last-1,pred); //mid3 is unknow,is a function for calculating the mid? while(p1 < p2){ while(pred(*p1,mid)&&(p1<p2)) ++p1; while(!pred(*p2,mid)&&(p1<p2)) --p2; if(p1 < p2){ swap(*p1,*p2); } } swap(*p1,*(last-2)); //what is sort ? sort(first,p1,pred); sort(p1+1,last,pred); }
- 排序算法的定制操作
排序算法只能由小到大。
二排序算法的定制操作,多了一个类型BinaryPredicate,可以用来定制规则。
template<class RandomIterator,class BinaryPredicate> void sort(RandomIterator first,RandomIterator last,BinaryPredicate){ if(first >= last || first + 1 == last) return; if(last - first <= 20) return bubble_sort(first,last,pred); auto mid = mid3(first,last,pred); auto p1 = first, p2 = last - 2; while(p1 < p2){ while(pred(*p1,mid) && (p1 < p2)) ++p1; while(!pred(*p1,mid) && (p1 < p2)) --p2; if(p1 < p2){ swap(*p1,*p2); } } swap(*p1,*(last-2)); sort(first,p1,pred); sort(p1+1,last,pred); }
谓词:相当于一个动作,比如一个需求,希望从大到小,则可以先定义一个谓词(函数)
bool cmp(const int& v1,const int &v2){
return v1 > v2;
}
sort(v.begin(),v.end(),cmp);
将该函数传递给sort算法时,就可以从小到大排序了。
lambda表达式:
在前面的例子中,定义了一个函数传递给sort算法,这个函数可以重复使用还好,如果使用一次的话就很麻烦。
这种情况下lambda就可以用上了,它相当于谓语,没有定义函数。
sort(v.begin(),v.end(),[]cmp(const int& int v1,const int& v2){
return v1 > v2;
}
---------------------------------------------------------------------------------------------------------------------
实验楼出品