Advertisement
dmkozyrev

string

Dec 1st, 2015
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. class String{
  7.     int _size; // длина
  8.     char * _str; // массив символов
  9. public:
  10. // Конструкторы и деструкторы
  11.     String(); // Дефолтный конструктор
  12.     String(const char *); // Конструктор с параметром
  13.     String(const String&); // Конструктор копирования
  14.     ~String(); // Деструктор
  15. // Операторы
  16.     String& operator =(const String&);
  17.     String& operator =(const char*);
  18.     void operator -=(const char*);
  19.     void operator -=(const String&);
  20.     void operator +=(const char*);
  21.     void operator +=(const String&);
  22. friend istream & operator >>(istream & is, String & s);
  23. friend ostream & operator <<(ostream & os, String const & s);
  24. friend bool operator == ( String const & a, String const & b );
  25. friend bool operator != ( String const & a, String const & b );
  26. friend bool operator < ( String const & a, String const & b );
  27. friend bool operator > ( String const & a, String const & b );
  28. friend bool operator <= ( String const & a, String const & b );
  29. friend bool operator >= ( String const & a, String const & b );
  30. friend String operator + ( String const & a, String const & b );
  31. // Функции
  32.     vector<int> all_pos(const char*) const; // Все вхождения подстроки в стиле си
  33.     int pos(const char*, int p = 0)const; // Первое вхождение подстроки в стиле си начиная с позиции p
  34.     int last_pos(const char*)const; // Последнее вхождение подстроки в стиле си
  35.  
  36.     vector<int> all_pos(const String& ) const; // Все вхождения подстроки
  37.     int pos(const String&, int p = 0)const; // Первое вхождение подстроки начиная с позиции p
  38.     int last_pos(const String&)const; // Последнее вхождение подстроки
  39.  
  40.     void erase(int p, int l); // удаляет l элементов начиная с позиции p
  41.  
  42.     void delete_left_spaces(); // удаляет пробелы слева
  43.     void delete_right_spaces(); // удаляет пробелы справа
  44.     void delete_all_spaces(); // удаляет все пробелы
  45.  
  46.     int remove(const char*); // Удаление всех вхождений подстроки в стиле си и возврат количества удалений
  47.     int remove(const String&); // Удаление всех вхождений подстроки и возврат количества удалений
  48.  
  49.     int replace(const char* substr, const char * str); // Замена всех вхождений подстроки в стиле си на строку в стиле си . Возврат количества замен
  50.     int replace(const char, const char); // Замена всех вхождений одного символа на другой символ . Возврат количества замен
  51.     int replace(const String&, const String&); // Замена всех вхождений подстроки на строку . Возврат количества замен
  52.  
  53.     char * select(int p, int l)const; // Выделение подстроки в стиле си длиной l символов начиная с позиции p
  54.     String select_str(int p, int l)const; // Выделение подстроки длиной l символов начиная с позиции p
  55.  
  56.     void to_lower(); // Преобразование к нижнему регистру
  57.     void to_upper(); // Преобразование к верхнему регистру
  58.  
  59.     void add(const char*); // Добавление подстроки в стиле си в конец строки
  60.     void add(const String&); // Добавление подстроки в конец строки
  61.    
  62.     void insert(const char*, int p); // Вставка строки в стиле си в позицию p
  63.     void insert(const String&, int p); // Вставка строки в позицию p
  64.  
  65.     int get_size() const ; // Получение длины строки
  66.     char* get_str() const; // Получение массива символов
  67.  
  68.     int compare ( const String& ) const; // Сравнение строки со строкой
  69. };
  70.  
  71. int main(){
  72.     String s1, s2 = "abcd";
  73.     for (int i = 0; i < 5; ++i) s1 += s2;
  74.     cout << s1 << endl;
  75.    
  76.     s1.replace("cd", "ba");
  77.     cout << s1 << endl;
  78.    
  79.     s1.remove("bb");
  80.     cout << s1 << endl;
  81.    
  82.     s1.to_upper();
  83.     cout << s1 << endl;
  84.    
  85. }
  86.  
  87. void String::insert(const char * s , int p) {
  88.     String temp = s;
  89.     insert(temp, p);
  90. }
  91.  
  92. void String::insert(const String & s, int p){
  93.     *this = select_str(0, p) + s + select_str(p+s._size , _size - p - s._size );
  94. }
  95.  
  96. int String::remove(const String & s){
  97.     return remove(s._str);
  98. }
  99.  
  100. void String::delete_left_spaces(){
  101.     int i;
  102.     for (i = 0; i < _size && isspace(_str[i]); ++i);
  103.     erase(0, i);
  104. }
  105.  
  106. void String::delete_right_spaces(){
  107.     int i;
  108.     for (i = _size-1; i >= 0 && isspace(_str[i]); --i);
  109.     i++;
  110.     erase(i, _size-i);
  111. }
  112.  
  113. void String::delete_all_spaces(){
  114.     int i = _size - 1, j;
  115.     while ( i >= 0 ) {
  116.         for (j = 0; i >= 0 && isspace( _str[i] ); --i) ++j;
  117.         _size -= j;
  118.         for (int k = i+1 ; k < _size; ++k) _str[k] = _str[k+j];
  119.         for (; i >= 0 && ! isspace( _str[i] ); --i) ;
  120.     }
  121.    
  122.     if ( _size != strlen(_str) )
  123.         *this = select_str(0, _size);
  124. }
  125.  
  126. void String::erase(int p, int l){
  127.     if ( p < _size ) {
  128.         if ( p + l > _size ) l = _size - p;
  129.         String temp1 = select_str (0, p);
  130.         String temp2;
  131.         p += l;
  132.         if ( p < _size )
  133.             temp2 = select_str(p, _size - p );
  134.         *this = temp1 + temp2;
  135.     }
  136. }
  137.  
  138. vector<int> String::all_pos(const String & s) const {
  139.     return all_pos(s._str);
  140. }
  141.  
  142. int String::pos(const String & s, int p)const {
  143.     return pos(s._str, p);
  144. }
  145.  
  146. int String::last_pos(const String & s)const{
  147.     return last_pos(s._str);
  148. }
  149.  
  150. void String::to_lower(){
  151.     for (int i = 0; i < _size; ++i)
  152.         *(_str+i) = tolower(*(_str+i));
  153. }
  154.  
  155. void String::to_upper(){
  156.     for (int i = 0; i < _size; ++i)
  157.         *(_str+i) = toupper(*(_str+i));
  158. }
  159.  
  160.  
  161. int String::replace(const char a, const char b){
  162.     char substr[2] = {a, '\0'};
  163.     char str[2] = {b, '\0'};
  164.     return replace(substr, str);
  165. }
  166.  
  167. int String::replace(const String & substr, const String & str){
  168.     return replace(substr._str, str._str);
  169. }
  170.  
  171. int String::replace(const char * substr, const char * str){
  172.     auto v = all_pos(substr);
  173.     int count = v.size();
  174.     int len1 = strlen(substr);
  175.     int len2 = strlen(str);
  176.     int new_len = _size - count * (len1-len2);
  177.     char * temp = new char [new_len+1];
  178.     *temp = '\0';
  179.     int i, p;
  180.     for ( i = 0, p = 0; i < count; ++i ){
  181.         strcat(temp, select(p, v[i]-p));
  182.         strcat(temp, str);
  183.         p = v[i] + len1;
  184.     }
  185.     if ( p < _size ) strcat(temp, select(p, _size-p));
  186.     temp[new_len] = '\0';
  187.     delete [] _str;
  188.     _str = temp;
  189.     _size = new_len;
  190.     return count;
  191. }
  192.  
  193. char * String::select(int p, int l)const{
  194.     String s = select_str(p, l);
  195.     int len = s.get_size();
  196.     char * temp = new char [ len + 1];
  197.     *temp = '\0';
  198.     strcat(temp, s._str);
  199.     temp[len] = '\0';
  200.     return temp;
  201. }
  202.  
  203. String String::select_str(int p, int l)const{
  204.     String s;
  205.     if ( p < _size ) {
  206.         if ( p + l > _size ) l = _size - p;
  207.         char * temp = new char [ l + 1 ];
  208.         //*temp = '\0';
  209.         for (int i = 0; i < l; ++i)
  210.             *(temp+i) = *(_str+p+i);
  211.         temp [l] = '\0';
  212.         s = temp;
  213.     }
  214.    
  215.     return s;          
  216. }
  217.  
  218. int String::compare ( const String & s ) const {
  219.     return strcmp(_str , s._str);
  220. }
  221.  
  222. istream & operator >>(std::istream & is, String & s){
  223.     const int N = 1024; // Максимум символов , которые могут быть прочитаны из потока
  224.     char temp[ N ];
  225.     is.getline(temp , N+1);
  226.     s = temp;
  227.     return is;
  228. }
  229.  
  230. ostream & operator <<(ostream & os, const String & s){
  231.     return os << s.get_str();
  232. }
  233.  
  234. bool operator == ( String const & a, String const & b ){ return ( a.compare(b) == 0 ); }
  235. bool operator != ( String const & a, String const & b ){ return !( a == b ); }
  236. bool operator < ( String const & a, String const & b ) { return ( a.compare(b) == -1 ); }
  237. bool operator > ( String const & a, String const & b ) { return ( a.compare(b) == 1 ); }
  238. bool operator <= ( String const & a, String const & b ) { return !( a > b ); }
  239. bool operator >= ( String const & a, String const & b ) { return !( a < b ); }
  240. String operator + ( String const & a, String const & b ) {
  241.     String temp = a;
  242.     temp += b;
  243.     return temp;
  244. }
  245.  
  246. int String::pos(const char * str, int p)const{
  247. // Функция возвращает первое вхождение подстроки в строку начиная с позиции p или -1 , если вхождений нет вообще
  248.     int len = strlen(str), answer = -1;
  249.     for (int i = p, j = 0; i < _size; ++i){
  250.         if ( _str[i] == str[j] ){
  251.             j++;
  252.             if ( j == len ) {
  253.                 answer = i-j+1;
  254.                 break;
  255.             }
  256.         } else j = 0;
  257.     }
  258.    
  259.     return answer;
  260. }
  261.  
  262. int String::last_pos(const char * str)const{
  263. // Функция возвращает последнее вхождение подстроки или -1 , если его нет
  264.     int len = strlen(str), answer = -1;
  265.     for (int i = _size -1, j = len-1; i >= 0; --i){
  266.         if ( _str[i] == str[j] ){
  267.             j--;
  268.             if ( j == -1 ) {
  269.                 answer = i;
  270.                 break;
  271.             }
  272.         } else j = len-1;
  273.     }
  274.    
  275.     return answer;
  276. }
  277.  
  278. vector<int> String::all_pos(const char* str)const {
  279. // Функция возвращает вектор из всех вхождений
  280.     vector<int> v;
  281.     int p = -1;
  282.     bool flag = true;
  283.     while ( flag ) {
  284.         p = pos( str , p+1);
  285.         if ( p != -1 )
  286.             v.push_back(p);
  287.         else
  288.             flag = false;
  289.     }
  290.     return v;
  291. }
  292.  
  293. void String::operator +=(const char* str){
  294.     add(str);
  295. }
  296.  
  297. void String::operator +=(const String& str){
  298.     add(str._str);
  299. }
  300.  
  301. void String::add(const char* str){
  302.     _size += strlen(str);
  303.     char* temp = new char[_size+1];
  304.     //*temp = '\0';
  305.     strcpy(temp,_str);
  306.     strcat(temp, str);
  307.     temp[_size] = '\0';
  308.     delete [] _str;
  309.     _str = temp;
  310. }
  311.  
  312. void String::operator -=(const char* str){
  313.     remove(str);
  314. }
  315.  
  316. void String::operator -=(const String& str){
  317.     remove(str._str);
  318. }
  319.  
  320. int String::remove(const char * str){
  321.     return replace(str, "");
  322.     /*
  323.     auto v = allPos(str);
  324.    
  325.     for(int i = v.size()-1, len = strlen(str); i >= 0; --i){
  326.         _size -= len;
  327.         for(int j = v[i]; j < _size; j++){
  328.             _str[j]=_str[j+len];
  329.         }
  330.     }
  331.    
  332.     if ( v.size() != 0 ) {
  333.         char* temp = new char[_size+1];
  334.         strncpy(temp, _str, _size);
  335.         temp[_size] = '\0';
  336.         delete [] _str;
  337.         _str = temp;
  338.     }
  339.    
  340.     return v.size();
  341.     */
  342. }
  343.  
  344. int String::get_size()const {return _size;}
  345. char* String::get_str()const {return _str;}
  346.  
  347. String::String(){
  348.     _size = 0;
  349.     _str = new char [1];
  350.     *_str = '\0';
  351. }
  352.  
  353. String::String(const char* str){
  354.     if (!str){
  355.         _size = 0; _str = 0;
  356.     } else {
  357.         _size = strlen (str);
  358.         _str = new char [_size +1];
  359.         strcpy(_str, str);
  360.     }
  361. }
  362.  
  363. String::String(const String& str){
  364.     _size = str._size;
  365.     if ( !str._str ){
  366.         _str = 0;
  367.     } else {
  368.         _str = new char[_size +1];
  369.         strcpy(_str, str._str);
  370.     }
  371. }
  372.  
  373. String::~String(){
  374.     delete [] _str;
  375. }
  376.  
  377. String& String::operator=( const char * str ){
  378.    if ( ! str ) {
  379.      _size = 0;
  380.      delete [] _str;
  381.      _str = 0;
  382.    } else {
  383.      _size = strlen( str );
  384.      delete [] _str;
  385.      _str = new char[ _size + 1 ];
  386.      strcpy( _str, str );
  387.    }
  388.    return *this;
  389. }
  390.  
  391. String& String::operator=( const String & str)
  392. {
  393.    if ( this != & str) {
  394.       delete [] _str;
  395.       _size = str._size;
  396.       if ( ! str._str )
  397.          _str = 0;
  398.       else {
  399.          _str = new char[ _size + 1 ];
  400.          strcpy( _str, str._str );
  401.       }
  402.    }
  403.    return *this;
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement