Advertisement
KShah

Untitled

Nov 11th, 2021
706
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <cstddef>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <ostream>
  5. #include <cassert>
  6.  
  7. class String{
  8.     // вывод из потока
  9.     friend std::ostream& operator<<(std::ostream& os, const String& s) {
  10.         os << s.str;
  11.         return os;
  12.     }
  13.     // ввод в поток
  14.     friend std::istream& operator>>(std::istream& is, const String& s) {
  15.         is >> s.str;
  16.         return is;
  17.     }
  18. private:
  19.     char* str = nullptr; // указатель на массив
  20.     size_t sz = 0; // размер
  21.     size_t maxsz = 1; // максимально возможный размер str
  22.  
  23.     void growBuffer() {
  24.         maxsz *= 2;
  25.         char* newstr = new char[maxsz];
  26.         memcpy(newstr, str, sz);
  27.  
  28.         delete[] str;
  29.         str = newstr;
  30.     }
  31.  
  32.     void cutBuffer() {
  33.         maxsz /= 2;
  34.         char* newstr = new char[maxsz];
  35.         memcpy(newstr, str, sz);
  36.  
  37.         delete[] str;
  38.         str = newstr;
  39.  
  40.     }
  41.  
  42. public:
  43.     // Конструктор по умолчанию
  44.     String() {}
  45.  
  46.     // Конструктор от C-style строки
  47.     String(const char* s): str(new char[strlen(s)]), sz(strlen(s)), maxsz(strlen(s)) {
  48.         memcpy(str, s, sz);
  49.     }
  50.     // Конструктор от двух параметров (size, char)
  51.     String(const size_t n, const char c): str(new char[n]), sz(n), maxsz(n) {
  52.         memset(str, c, n);
  53.     }
  54.      
  55.     // Конструктор копирования
  56.     String(const String &s): str(new char[s.sz]), sz(s.sz), maxsz(s.sz)  {
  57.        memcpy(str, s.str, s.sz);
  58.     }
  59.  
  60.     // Оператор присваивания
  61.     String& operator=(const String& other) {
  62.         String copy = other;
  63.         sz = copy.sz;
  64.  
  65.         maxsz = other.maxsz;
  66.         delete[] str;
  67.  
  68.         str = new char[maxsz];
  69.         memcpy(str, copy.str, sz);
  70.  
  71.         return *this;          
  72.     }
  73.  
  74.     // Оператор ==, проверка строк на совпадение
  75.     bool operator==(const String& s) {
  76.         if (this->sz != s.sz) {
  77.             return false;
  78.         } else {
  79.             for (size_t i = 0; i < this->sz; ++i) {
  80.                 if (this->str[i] != s.str[i]) {
  81.                     return false;
  82.                 }
  83.             }  
  84.             return true;
  85.         }
  86.     }
  87.  
  88.     // Квадратные скобки для конст. строк
  89.     const char& operator[](const size_t pos) const {
  90.         return str[pos];
  91.     }
  92.     // Квадратные скобки для неконст. строк
  93.     char& operator[](const size_t pos) {
  94.         return str[pos];
  95.     }
  96.  
  97.     // length() - размер строки
  98.     int length() const {
  99.         return sz;
  100.     }
  101.  
  102.     // push_back(char), pop_back() за O(1) амортизиованно
  103.     void Push_back(const char c) {
  104.         if (sz == maxsz) {
  105.             growBuffer();
  106.         }
  107.         str[sz] = c;
  108.         sz++;
  109.     }
  110.  
  111.     void Pop_back() {
  112.         if (sz <= (maxsz / 4)) {
  113.             cutBuffer();
  114.         }
  115.         --sz;
  116.     }
  117.     // front(), back() - ссылка на начальный и на последний символы строки
  118.    
  119.     char& front() const {
  120.         return str[0];
  121.     }
  122.    
  123.     char& back() const {
  124.         return str[sz - 1];
  125.     }
  126.  
  127.     // += - добавить к строке символ или строку. Символ за O(1) учётно.
  128.     String& operator+=(const String& s) {
  129.         for (size_t i = 0; i < s.sz; ++i) {
  130.             Push_back(s[i]);
  131.         }
  132.         return *this;
  133.     }
  134.    
  135.     String& operator+=(const char c) {
  136.         Push_back(c);
  137.         return *this;
  138.     }
  139.     // + -  оператор складывания 1) строки с символом 2) символ и строка 3) строка и строка
  140.     String& operator+(const String& s) {
  141.         *this += s;
  142.         return *this;
  143.     }
  144.     // find(substring), rfind(substring) - индекс вхождения строки с начала и с конца (length - в противном случае)
  145.    
  146.     size_t find(const String& subStr) const {
  147.         int flag = 1;
  148.         for (size_t i = 0; i < sz; ++i) {
  149.             for (size_t j = 0; j < subStr.sz; ++j) {
  150.                 if (i + j >= sz) {
  151.                     flag = 0;
  152.                     break;
  153.                 }
  154.                 if (str[i + j] != subStr.str[j]) {
  155.                     flag = 0;
  156.                     break;
  157.                 }
  158.             }
  159.             if (flag == 1) {
  160.                 return i;
  161.             }
  162.             flag = 1;
  163.         }
  164.         return sz;
  165.     }
  166.  
  167.     size_t rfind(const String& subStr) const {
  168.         int flag = 1;
  169.         for (size_t i = 0; i < sz; ++i) {
  170.             for (size_t j = 0; j < subStr.sz; ++j) {
  171.                 if ((sz - 1 - i + j) >= sz) {
  172.                     flag = 0;
  173.                     break;
  174.                 }
  175.                 if (str[sz - 1 - i + j] != subStr.str[j]) {
  176.                     flag = 0;
  177.                     break;
  178.                 }
  179.             }
  180.  
  181.             if (flag == 1) {
  182.                 return sz - 1 - i;
  183.             }
  184.             flag = 1;
  185.         }
  186.         return sz;
  187.     }
  188.     // substr(start, count) - вернуть подстроку длины count начиная со start
  189.     String substr(size_t start, size_t count) const {
  190.         String res(count, '\0');
  191.         for (size_t i = start; i < start + count; ++i) {
  192.             res.str[i] = str[i];
  193.         }
  194.         return res;
  195.     }
  196.  
  197.     // empty() - проверка на пустоту
  198.     bool empty() const {
  199.         if (sz == 0) {
  200.             return true;
  201.         } else {
  202.             return false;
  203.         }
  204.     }
  205.  
  206.     // clear() - очистка строки
  207.     void clear() {
  208.         delete[] str;
  209.         sz = 0;
  210.         maxsz = 1;
  211.         str = nullptr;
  212.     }  
  213.     // ~ Деструктор
  214.     ~String() {
  215.         delete[] str;
  216.     }
  217. };
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement