Advertisement
KShah

Untitled

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