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 ;
}