Advertisement
dmkozyrev

class String

Oct 29th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. using namespace std;
  5. class String{
  6.     int _size;
  7.     char * _str;
  8. public:
  9.     String();
  10.     String(const char *);
  11.     String(const String&);
  12.     ~String();
  13.     String& operator =(const String&);
  14.     String& operator =(const char*);
  15.     void operator -=(const char*);
  16.     void operator -=(const String&);
  17.     void operator +=(const char*);
  18.     void operator +=(const String&);
  19.     vector<int> allPos(const char*);
  20.     int removeStr(const char*);
  21.     void add(const char*);
  22.     int getSize();
  23.     char* getStr();
  24. };
  25.  
  26. vector<int> String::allPos(const char* str){
  27.     vector<int> v; int len = strlen(str);
  28.     for (int i = 0, j = 0; i < _size; ++i){
  29.         if ( _str[i] == str[j] ){
  30.             j++;
  31.             if ( j == len ) {
  32.                 v.push_back(i-j+1);
  33.                 --i;
  34.             }
  35.         } else j = 0;
  36.     }
  37.     return v;
  38. }
  39.  
  40. void String::operator +=(const char* str){
  41.     add(str);
  42. }
  43.  
  44. void String::operator +=(const String& str){
  45.     add(str._str);
  46. }
  47.  
  48. void String::add(const char* str){
  49.     _size += strlen(str);
  50.     char* temp = new char[_size+1];
  51.     strcpy(temp,_str);
  52.     strcat(temp, str);
  53.     temp[_size] = '\0';
  54.     delete [] _str;
  55.     _str = temp;
  56. }
  57.  
  58. void String::operator -=(const char* str){
  59.     removeStr(str);
  60. }
  61.  
  62. void String::operator -=(const String& str){
  63.     removeStr(str._str);
  64. }
  65.  
  66. int String::removeStr(const char * str){
  67.     auto v = allPos(str);
  68.    
  69.     for(int i = v.size()-1, len = strlen(str); i >= 0; --i){
  70.         _size -= len;
  71.         for(int j = v[i]; j < _size; j++){
  72.             _str[j]=_str[j+len];
  73.         }
  74.     }
  75.    
  76.     if ( v.size() != 0 ) {
  77.         char* temp = new char[_size+1];
  78.         strncpy(temp, _str, _size);
  79.         temp[_size] = '\0';
  80.         delete [] _str;
  81.         _str = temp;
  82.     }
  83.    
  84.     return v.size();
  85. }
  86.  
  87. int String::getSize(){return _size;}
  88. char* String::getStr(){return _str;}
  89.  
  90. String::String(){
  91.     _size = 0;
  92.     _str = 0;
  93. }
  94.  
  95. String::String(const char* str){
  96.     if (!str){
  97.         _size = 0; _str = 0;
  98.     } else {
  99.         _size = strlen (str);
  100.         _str = new char [_size +1];
  101.         strcpy(_str, str);
  102.     }
  103. }
  104.  
  105. String::String(const String& str){
  106.     _size = str._size;
  107.     if ( !str._str ){
  108.         _str = 0;
  109.     } else {
  110.         _str = new char[_size +1];
  111.         strcpy(_str, str._str);
  112.     }
  113. }
  114.  
  115. String::~String(){
  116.     delete [] _str;
  117. }
  118.  
  119. String& String::operator=( const char * str ){
  120.    if ( ! str ) {
  121.      _size = 0;
  122.      delete [] _str;
  123.      _str = 0;
  124.    } else {
  125.      _size = strlen( str );
  126.      delete [] _str;
  127.      _str = new char[ _size + 1 ];
  128.      strcpy( _str, str );
  129.    }
  130.    return *this;
  131. }
  132.  
  133. String& String::operator=( const String & str)
  134. {
  135.    if ( this != & str) {
  136.       delete [] _str;
  137.       _size = str._size;
  138.       if ( ! str._str )
  139.          _str = 0;
  140.       else {
  141.          _str = new char[ _size + 1 ];
  142.          strcpy( _str, str._str );
  143.       }
  144.    }
  145.    return *this;
  146. }
  147.  
  148. int main(){
  149.     String s1("hello");
  150.     String s2("_world");
  151.     for (int i = 0; i < 10; ++i)
  152.         s1 += s2;
  153.     cout<< "s1 = "<<s1.getStr()<<endl;
  154.     cout<< "size s1 = " << s1.getSize()<<endl;
  155.     s1 -= "wor";
  156.     cout<< s1.getStr()<<endl;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement