C++ 泛型算法

C++ 的泛型算法一般传递三个参数,前面2个是容器的迭代器,第三个是容器的元素类型的实例。比如Accumulate是个累加算法,对于数值类型的容器操作时是求和,而对于std::string来说是字符串相接。它的算法原型:
T accumulate( iterator_first , iterator_second , T) ;
这个算法施行于vector<int> 时的原型:
int accumulate( vector<int>::iterator iterator_first , vector<int>::iterator iterator_second , int ) ;
如下调用时,就对数据求和:
vector<int> vec{1,2,3,56} ;
int sum = accumulate( vec.begin() , vec.end() , 0 ) ;//62
accumulate 要使用T的+操作,对于内置类型,+已经被实现。对于自定义的类型A,则要实现operator+ 这个方法:
A operator+( A a )
对于find算法,参数原型类似,但需要实现一个 operator == 方法。
下面是使用accumulate 和 find这两个泛型算法的例子代码:
 

#include <iostream>
#include <vector>
#include <list>
#include <initializer_list>
#include <cassert>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <algorithm>
class dR {
private :
    int r1 ;
    int r2 ;
public:
    dR(int r1 , int r2){
        this->r1 = r1 ;
        this->r2 = r2 ;
    }
    dR operator+ ( dR p2 ){
        return (dR(r1+p2.r1 , r2+p2.r2 )) ;
    }
    bool operator== ( dR rhs ){
        return ( r1 == rhs.r1 && r2 == rhs.r2 ) ;
    }
    friend ostream& operator << ( ostream& o , dR& dr ) ;
};

ostream& operator << ( ostream& o , dR& dr )
{
    o <<"(" << dr.r1 <<"," << dr.r2 << ")" ;
    return o ;
}


void testAlgorithm()
{
    set<int> seta{1,20,3} ;
    int z = accumulate(seta.begin(), seta.end() , 100 ) ;
    cout << "accumulate of int:" << z << endl ;

    set<string> setb{"1","20","3"} ;
    string s = accumulate(setb.begin(), setb.end() , string("") ) ;
    cout << "accumulate of int:" << s << endl ;

    set<string>::iterator f = find( setb.begin(), setb.end() , "20" ) ;
    cout << "find:" << *f << endl  ;

    vector<dR> vdr;
    vdr.push_back(dR(1,1));
    vdr.push_back(dR(2,3));
    for ( auto ed : vdr ){
        cout << ed << endl ;
    }

    dR sumDr = accumulate(vdr.begin(), vdr.end() , dR(0,0)  ) ;
    cout << sumDr << endl ;

    vector<dR>::iterator drf = find( vdr.begin(), vdr.end() , dR(2,3) ) ;
    cout << "find dR:" <<  *drf <<  endl ;
}


int main()
{
    testAlgorithm() ;
    return 0 ;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值