stl算法解析1

stl是一个c++自带的强大的类库,名字叫模板标准库,使用了c++的四个编程范式,模板泛型编程,是一种可以在编译时编译器生成和展开模板函数,类的思想,并且模板还可以与仿函数结合起来,即=例如

template<class T>

class multi_policy
{
public:
multi_policy(const T& value):_value(value){}
T operator()()const{
return _value;
}
void operator()( T& that){
that*=_value;
}
private:
T _value;

};

这是一个模板类,构造函数以引用的方式,即是传地址,而不是拷贝,这样可以提高效率,构造函数传入一个引用值,然后在类中添加operator()的函数,可以用此来在泛型函数中适配,如for_each(psz,psz+10,multi_policy<int>(100));那么for_each是如何实现的呢,

template<class T,class Func>

void for_each(T first,T end,Func func)

{

for(;first!=end;++first)

func(*first);

}

当然stl之中不仅有这一个函数,例如

template<class Iter,class Pre>              /*产生随机数*/
void _generate(Iter F1,Iter L1,Pre P)
{
for(;F1!=L1;++F1)
*F1=P();
}

这个函数可以给被操纵的数据复,第二个模板参数,因为使用了泛型模板,所以可以是c语言函数指针,c++de仿函数

template<class Iter1,class Iter2,class Pre>              //查找两个序列的不匹配
pair<Iter1,Iter2> _mismatch(Iter1 F1,Iter1 L1,Iter2 F2,Iter2 L2,Pre P)
{
for(;F1!=L1&&F2!=L2&&P(*F1,*F2);++F1,++F2)
;
return make_pair(F1,F2);
}

这个函数遍历两个序列,如果仿函数测试的数列为真,则继续,否则退出,使用make_pair来返回两个值

template<class Iter1,class Iter2>  //比较两个序列
int _lexicographical_compare(Iter1 F1,Iter1 L1,Iter2 F2,Iter2 L2)
{
do{
if(F2==L2)
return 1;
if(F1==L1)
return -1;
if(*F1<*F2)
return -1;
if(*F1>*F2)
return 1;
++F1,++F2;
}while(F1!=L1||F2!=L2);
return 0;
}

这个函数是stl的字典字符比较法,如果前一个序列大,则返回真,小,则返回假,如果两个序列字符相同并且长度相同,则返回0

template<class Iter,class Pre>  //查找一个序列相邻的不匹配
Iter _find_adjacent_mismatch(Iter F1,Iter L1,Pre P)
{
if(F1==L1)
return F1;
Iter T;
do
{
T=F1;
++F1;
}while(F1!=L1&&P(*T,*F1));
return F1;
}

这个函数是对一个序列中的数列进行测试,如果相邻的测试函数/仿函数为真,则继续,为假,则结束

template<class Iter>
Iter _unique(Iter F1,Iter L1)
{
queue<Iter> Q;
Iter T=_find_adjacent_mismatch1(F1,L1);
while(T!=L1)
{
Q.push(T);
T=_find_adjacent_mismatch1(T,L1);
}
Q.push(L1);


Iter CD=Q.front();
Iter CR=Q.front();
Q.pop();


while(CR!=L1)
{
while(++CR!=Q.front())
*CD=*CR,++CD;
Q.pop();
}
return CD;
}

这个函数,是用来消除的,使用了队列

template<class Iter,class T>
Iter _find(Iter F1,Iter L1,const T& value)
{
for(;F1!=L1&&*F1!=value;)
;
return F1;
}

find函数是来查找一个数列的是否于此值相同的意义

template<class Iter,class Pre>
Iter _find_if(Iter F1,Iter L1,Pre P)
{
for(;F1!=L1&&!P(*F1);++F1)
;
return F1;
}

template<class Iter,class Pre>
Iter _find_if(Iter F1,Iter L1,Pre P)
{
for(;F1!=L1&&!P(*F1);++F1)
;
return F1;
}

是可以使用仿函数或者函数指针来进行查找













猜你喜欢

转载自blog.csdn.net/anzijian1993/article/details/51690351
今日推荐