Завершите Basic_substring из параграфа 20.3.13 и интегрируйте его с типом String, который перегружает операцию () со смыслом «взять подстроку», а во всем остальном эквивалентен типу string.
Вот код который в книге, он интегрирован с basic_string, мне его интегрировать со String не охота, потому что в String нету функций find() и replace(), это мне еще их нужно определить, что бы интегрировать.
Вот код тот что в книге интегрированный с классом basic_string.
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 |
#include <iostream> using std::cout; using std::endl; #include <string> using std::basic_string; using std::string; #include <cstdlib> using std::exit; #include <cstring> using std::strlen; #include "String.h" template<class Ch> class Basic_substring//шаблон замены подстроки { public: typedef typename basic_string<Ch>::size_type size_type;//беззнаковый видимо тип //конструктор преобразования //принимает строку i и n (n+i-1) Basic_substring(basic_string<Ch>& s, size_type i, size_type n1);//s[i]...s[i+n-l] //конструктор преобразования //принимает две строки, походу заменяет одну строку другой Basic_substring(basic_string<Ch>& s, const basic_string<Ch>& s2);//s2 в s //конструктор преобразования //принимает строку и константную строку Basic_substring(basic_string<Ch>& s, const Ch* p);// *p в s //присваивает подстроке значение другой строки Basic_substring operator=(const basic_string<Ch>&); //присваивает значение объекта другому объекту Basic_substring operator=(const Basic_substring<Ch>&){return *this;} //присваивает значение при передаче типа Ch* указателя Basic_substring operator=(const Ch*); //а это символа Basic_substring operator=(Ch); //оператор преобразования похоже operator basic_string<Ch>()const; // operator const Ch*() const; private: basic_string<Ch>* ps;//указатель на саму строку size_type pos;//позиция вхождения подстроки в s size_type n;//количество элементов }; //конструктор преобразования template<class Ch> Basic_substring<Ch>::Basic_substring(basic_string<Ch>& s, size_type i, size_type n1) :ps(&s),pos(i) { if(n1==s.npos) n=s.length()-1; else n=n1; // cout <<i<<' '<<n<<endl; } //конструктор преобразования принимает строку и подстроку template<class Ch> Basic_substring<Ch>::Basic_substring(basic_string<Ch>& s,const basic_string<Ch>& s2) :ps(&s),n(s2.length())//ps - указатель на s, n-количество символов в s2, //pos - позиция вхождения в s подстроки s2 { pos=s.find(s2); } //конструктор преобразования для константной строки типа char* template<class Ch> Basic_substring<Ch>::Basic_substring(basic_string<Ch>& s, const Ch* p) :ps(&s),n(strlen(p))//ps-указатель на s, n-количество символов в p { pos=s.find(p); } template<class Ch> //оператор присваивает подстроке значениеы Basic_substring<Ch> Basic_substring<Ch>::operator=(const basic_string<Ch>& s) { cout <<"ss= "<<s<<endl; ps->replace(pos,n,s); return *this; } //оператор присваивания для константных строк template<class Ch> Basic_substring<Ch> Basic_substring<Ch>::operator=(const Ch* s) { ps->replace(pos,n,s); return *this; } template<class Ch> Basic_substring<Ch>::operator basic_string<Ch>()const { // cout <<"Mu tyt"<<endl; return basic_string<Ch>(*ps,pos,n); } typedef Basic_substring<char> Substring; void f() { string s="Mary had a little lamb"; Substring(s,"lamb")="fun"; Substring(s,"a little")="no"; cout <<s<<endl; string s1=Substring(s,s.find(' '),string::npos); cout <<s1<<endl; string s2="Joe"+(string)Substring(s,s.find(' '),string::npos);//строка, позиция пробела, признак конца строки cout <<"s2= "<<s2<<endl; } int main() { f(); return 0; } |
[youtube]http://www.youtube.com/watch?v=BAGsBP2rlZM[/youtube]