设计一个泛型算法

算法的目的很简单,找出小于(大于)elem_size的元素并打印.

先贴上代码:

#include  < algorithm >   // 泛型算法
#include  < functional >   // function object
#include  < vector >
#include 
< iostream >

using   namespace  std;

template 
< typename InputIterator,typename OutputIterator,
      typename ElemType,     typename Comp 
>
    
OutputIterator 
filter(InputIterator first,InputIterator last,
       OutputIterator at, 
const  ElemType  & val,Comp pred)  
{
    
// 从first到last的地址搜索小于(或大于)val对象的对象,找到后把该对象地址赋给first
     while ((first = find_if(first,last,bind2nd(pred,val))) != last)
    {
        cout 
<<   "  found value : "   <<   * first  << endl;
        
        
* at ++=* first ++ ;
    }

    
return  at;
}

int  main()
{
    
const   int  elem_size  =   8 ;
    //数组测试
    
int  ia[elem_size] = { 12 , 8 , 43 , 0 , 6 , 21 , 3 , 7 };
    int ia2[elem_size];
    //vector测试
    vector
< int >  ivec(ia,ia + elem_size);
    
vector < int >  ivec2(elem_size);

    cout 
<<   " less than 8 " ;
    filter(ia,ia
+ elem_size,ia2,elem_size,less < int > ());

    cout 
<<   " greater than 8 " ;
    filter(ivec.begin(),ivec.end(),ivec2.begin(),elem_size,greater
< int > ());

    
return   0 ;
}



几点说明:

1.函数与元素型别无关,与比较操作无关,更和容器型别无关,这样,函数就初步转化为一个泛型算法了.

2.function object adapter 会对 function object 进行修改操作.上例中bind2nd会将指定值绑定至第二操作数,即val成为pred function object的第二个参数,同理bind1st将指定值绑定至第一操作数.

3.上例中的OutputIterator filter 函数中的OutputIterator对应参数并没有使用引用,因为cout操作是在此函数内进行,所以不需要使用对象的引用.






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值