程序设计实习第十九讲标准模板库(二)本讲作业:写一个自己的CMyostream_iterator模板,使之能和ostream_iterator模板达到一样的效果,即#includevector#includeiostream#includealgorithmusingnamespacestd;main(){inta[5]={1,2,3,4,5};CMyostream_iteratorintoutput(cout,*);vectorintv(a,a+5);copy(v.begin(),v.end(),output);}程序的输出结果是:1*2*3*4*5*注意,编写CMyostream_iterator时不能使用ostream_iterator注意,编写CMyostream_iterator时不能使用ostream_iterator参考copy的helpcopytemplateclassInIt,classOutItOutItcopy(InItfirst,InItlast,OutItx);Thetemplatefunctionevaluates*(x+N)=*(first+N))onceforeachNintherange[0,last-first),forstrictlyincreasingvaluesofNbeginningwiththelowestvalue.Itthenreturnsx+N.Ifxandfirstdesignateregionsofstorage,xmustnotbeintherange[first,last)copy的源代码:templateclass_II,class_OIinline_OIcopy(_II_F,_II_L,_OI_X){for(;_F!=_L;++_X,++_F)*_X=*_F;return(_X);}4.2list容器在任何位置插入删除都是常数时间,不支持随机存取除了具有所有顺序容器都有的成员函数以外,还支持8个成员函数:push_front:在前面插入pop_front:删除前面的元素sort:排序(list不支持STL的算法sort)remove:删除和指定值相等的所有元素unique:删除所有和前一个元素相同的元素merge:合并两个链表,并清空被合并的那个reverse:颠倒链表splice:在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素#includelist#includeiostream#includealgorithmusingstd::list;usingstd::ostream;usingstd::cout;usingstd::endl;classA{private:intn;public:A(intn_){n=n_;}friendbooloperator(constA&a1,constA&a2);friendbooloperator==(constA&a1,constA&a2);friendostream&operator(ostream&o,constA&a);};booloperator(constA&a1,constA&a2){returna1.na2.n;}booloperator==(constA&a1,constA&a2){returna1.n==a2.n;}ostream&operator(ostream&o,constA&a){oa.n;returno;}templateclassTvoidPrintList(conststd::listT&lst){inttmp=lst.size();if(tmp0){std::listT::const_iteratori;i=lst.begin();for(i=lst.begin();i!=lst.end();i++)cout*i,;}}main(){listAlst1,lst2;lst1.push_back(1);lst1.push_back(3);lst1.push_back(2);lst1.push_back(4);lst1.push_back(2);lst2.push_back(10);lst2.push_front(20);lst2.push_back(30);lst2.push_back(30);lst2.push_back(30);lst2.push_front(40);lst2.push_back(40);cout1);PrintList(lst1);coutendl;cout2);PrintList(lst2);coutendl;lst2.sort();cout3);PrintList(lst2);coutendl;lst2.pop_front();cout4);PrintList(lst2);coutendl;lst1.remove(2);//删除所有和A(2)相等的元素cout5);PrintList(lst1);coutendl;lst2.unique();//删除所有和前一个元素相等的元素cout6);PrintList(lst2);coutendl;lst1.merge(lst2);//合并lst2到lst1并清空lst2cout7);PrintList(lst1);coutendl;cout8);PrintList(lst2);coutendl;lst1.reverse();cout9);PrintList(lst1);coutendl;lst2.push_back(100);lst2.push_back(200);lst2.push_back(300);lst2.push_back(400);std::listA::iteratorp1,p2,p3;p1=std::find(lst1.begin(),lst1.end(),3);p2=std::find(lst2.begin(),lst2.end(),200);p3=std::find(lst2.begin(),lst2.end(),400);lst1.splice(p1,lst2,p2,p3);//将[p2,p3)插入p1之前,//并从lst2中删除[p2,p3)cout11);PrintList(lst1);coutendl;cout12);PrintList(lst2);coutendl;}输出:1)1,3,2,4,2,2)40,20,10,30,30,30,40,3)10,20,30,30,30,40,40,4)20,30,30,30,40,40,5)1,3,4,6)20,30,40,7)1,3,4,20,30,40,8)9)40,30,20,4,3,1,11)40,30,20,4,200,300,3,1,12)100,400,4.3deque容器所有适用于vector的操作都适用于dequedeque还有push_front(将元素插入到前面)和pop_front(删除最前面的元素)操作5函数对象是个对象,但是用起来看上去象函数调用,实际上也执行了函数调用classCMyAverage{public:doubleoperator()(inta1,inta2,inta3){//重载()运算符return(double)(a1+a2+a3)/3;}};//重载()运算符时,参数可以是任意多个CMyAverageAverage;//函数对象coutAverage(3,2,3);//Average.operator(3,2,3)用起来看上去象函数调用输出2.66667函数对象的应用:STL里有以下模板:templateclassInIt,classT,classPredTaccumulate(InItfirst,InItlast,Tval,Predpr);pr就是个函数对象,实际上是个函数也可以对[first,last)中的每个迭代器I,执行val=pr(val,*I),返回最终的val#includeiostream#includevector#includealgorithm#includenumeric#includefunctionalusingnamespacestd;intsumSquares(inttotal,intvalue){returntotal+value*value;}templateclassTclassSumSquaresClass{public:constT&operator()(constT&total,constT&value){returntotal+value*value;}};intmain(){constintSIZE=10;inta1[]={1,2,3,4,5,6,7,8,9,10};vectorintv(a1,a1+SIZE);ostream_iteratorintoutput(cout,);cout1);copy(v.begin(),v.end(),output);coutendl;intresult=accumulate(v.begin(),v.end(),0,sumSquares);cout2)平方和:resultendl;SumSquaresClassints;result=accumulate(v.begin(),v.end(),0,s);//(1)cout3)平方和:result;}输出:1)123456789102)平方和:3853)平方和:385课本上是:classSumSquaresClass:publicbinary_functionT,T,T{public:constT&operator()(constT&total,constT&value){returntotal+value*value;}};….result=accumulate(v.begin(),v.end(),0,SumSquaresClassint());//(1)效果一样binary_function定义:templateclassArg1,classArg2,classResultstructbinary_function{typedefArg1first_argument_type;typedefArg2second_argument_type;typedefResultresult_type;};STL的functional里还有以下函数对象类模板(P750):dividesTequal_toTgreaterTlessT…….这些模板可以用来生成函数对象greaterT函数对象类模板templateclassTstructgreater:publicbinary_functionT,T,bool{booloperator()(constT&x,constT&y)const{returnxy;}};greaterT的应用:list有两个sort函数,前面看到的是不带参数的sort函数,它将list按规定的比较方法升序排列list还有另一个sort函数:voidsort(greaterTpr);可以用来进行降序排序#includelist#includeiostreamusingnamespacestd;main(){constintSIZE=5;inta[SIZE]={5,1,4,2,3};listintlst(a,a+SIZE);lst.sort(greaterint());//greaterint()是个对象//本句进行降序排序ostream_iteratorintoutput(cout,,);copy(lst.b