Определите версию iseq() (параграф 18.3.1), для встроенных массивов, istream и пар итераторов. Задайте подходящий набор перегруженных не модифицирующих последовательность алгоритмов (параграф 18.5) для работы с Iseq. Обсудите как избежать неоднозначностей и сильного роста числа функциональных шаблонов.
Ладно господа тема конечно галимая, ну я тут перегрузил немного функций-алгоритмов find, find_if и mismatch. Для find и find_if не перегрузил встроенные массивы это как бы указатели, а для mismatch кажется все перегрузил, нет ну фиговенько конечно создавать шаблоны, их если честно сказать тяжело создавать.
Не охота парится больше от в общем готовый примерчик кода, тот который у меня получился.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
#include <iostream> using std::cout; using std::endl; #include <list> using std::list; #include <algorithm> using std::find; using std::find_if; using std::mismatch; #include <string> using std::string; #include <utility> using std::pair; #include <functional> using std::equal_to; using std::bind2nd; //Iseq для одной пары template<class In> struct Iseq : public pair<In,In> { In ii3; Iseq(In i1, In i2) : pair<In,In>(i1,i2),ii3(i2){} Iseq(In i1, In i2, In i3) : pair<In,In>(i1,i2),ii3(i3){} }; //iseq для одной пары template<class C> Iseq<typename C::iterator> iseq(C& c)//для всего контейнера { return Iseq<typename C::iterator>(c.begin(),c.end()); } //перегрузка для двух пар итераторов (функция) template<class C> Iseq<typename C::iterator> iseq(C& c,C& c1)//для всего контейнера { return Iseq<typename C::iterator>(c.begin(),c.end(),c1.begin()); } //перегрузка для двух пары встроенных массивов (функция) template<class C> Iseq<C*> iseq(C* c,C* c1)//для всего контейнера { return Iseq<C*>(c, (c+sizeof(c)/sizeof(C)),c1); } //перегрузка find template<class In,class T> In find(Iseq<In> r,const T& v)//расширение { return find(r.first,r.second,v); } //перегрузка find_if template<class In, class T,class C> In find_if(Iseq<In> r,C (*ptr)(T)) { return find_if(r.first,r.second,ptr); } //перегрузка mismatch template<class In,class T,class C> pair<In,In> mismatch(Iseq<In> r,C(*ptr)(T,T))//,bool(*ptr)(T,T)) { //cout <<"mu tyt"<<endl;exit(1); //return pair<In,In>(); return mismatch(r.first,r.second,r.ii3,ptr);//,ptr); } //перегрузка mismatch для типа template<class In,class T> pair<In,In> mismatch(Iseq<In> r,T& o)//,bool(*ptr)(T,T)) { //cout <<"mu tyt"<<endl;exit(1); //return pair<In,In>(); return mismatch(r.first,r.second,r.ii3,o);//,ptr); } void f(list<string>& ls) { list<string>::iterator p=find(ls.begin(),ls.end(),"standard"); list<string>::iterator q=find(iseq(ls),"two"); if(q!=ls.end()) cout <<"*q= "<<*q<<endl; else cout <<"not find"<<endl; //... } //собственный предикат bool pr(string a){return ("two"==a);} bool pr1(int a,int b){return (a==b);} struct Obj { bool operator()(int a,int b){return (a==b);} }obj1; int main() { list<string> l; l.push_back("one"); l.push_back("two"); l.push_back("three"); l.push_back("four"); f(l); list<string>::iterator it; //iseq(l) l type list<string> //find it=find(iseq(l),"three"); if(it!=l.end()) cout <<"*it= "<<*it<<endl;//three //find_if it=find_if(l.begin(),l.end(),pr); it=find_if(iseq(l),pr); if(it!=l.end()) cout <<"*it= "<<*it<<endl;//two //mismatch int mass[]={1,2,3,4,5}; list<int> l1(mass,mass+5); int mass1[]={1,2,8,4,5}; list<int> l2(mass1,mass1+5); pair<list<int>::iterator,list<int>::iterator> rez,rez1,rez2; pair<int*,int*> rez3; //rez=mismatch(mass,mass+5,mass1,pr1); rez=mismatch(iseq(l1,l2),pr1);//,pr1); cout <<"*rez.first= "<<*rez.first<<" *rez.second= "<<*rez.second<<endl; //вызов для типа rez1=mismatch(iseq(l1,l2),obj1); cout <<"*rez1.first= "<<*rez1.first<<" *rez1.second= "<<*rez1.second<<endl; rez2=mismatch(iseq(l1,l2),equal_to<int>()); cout <<"*rez2.first= "<<*rez2.first<<" *rez2.second= "<<*rez2.second<<endl; rez3=mismatch(iseq(mass,mass1),pr1); cout <<"*rez3.first= "<<*rez3.first<<" *rez3.second= "<<*rez3.second<<endl; int mass4[]={1,2,3,4,5}; int* p=mass4; int* p_end=mass4+sizeof(mass4)/sizeof(int); for(;p!=p_end;p++) cout <<*p<<' '; cout <<endl; return 0; } |
Еще мне для istream примерчик подкинули, я в него не вникал, да как то лень, от в общем щас вам покажу примерчик.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
template<typename In> struct iseq_t : std::pair<In, In> { iseq_t(In f, In s) : std::pair<In, In>(f, s) { } }; template<typename T> iseq_t<std::istream_iterator<T> > iseq(std::istream& in) { return iseq_t<std::istream_iterator<T> >(std::istream_iterator<T>(in), std::istream_iterator<T>()); } template<typename In, typename T> In find(iseq_t<In> seq, const T& value) { return std::find(seq.first, seq.second, value); } int main() { std::istringstream ss("1 2 3 4 5 6"); std::cout << *find(iseq<int>(ss), 5) << std::endl; } |
он конечно не рабочий, хотя возможно и рабочий просто не хватает мб кое каких заголовочных файлов подключить и все.
[youtube]http://www.youtube.com/watch?v=awPEQ64AFtw[/youtube]