Advertisement
Derga

Untitled

May 12th, 2023
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. const unsigned DefaultBlockSize = 10;
  4.  
  5.  
  6. template<typename T>
  7. class my_vector
  8. {
  9.     T* parray;
  10.     unsigned size;
  11.     unsigned length;
  12.  
  13.     unsigned block;
  14.  
  15.     unsigned calc_alloc(unsigned req)
  16.     {
  17.         unsigned res = req / block;
  18.         if (req % block)
  19.             ++res;
  20.         res *= block;
  21.         return res;
  22.     }
  23.  
  24. public:
  25.     //Коструктор по умолчанию. Нет аргументов.
  26.     my_vector() : parray(nullptr), size(0), length(0), block(DefaultBlockSize) { }
  27.    
  28.     //Конструктор копирования. Аргумент - другой вектор
  29.     my_vector(const my_vector& v) : size(v.size), length(v.length), block(v.block)
  30.     {
  31.         //Выделил столько сколько, сколько использовано в векторе-аргументе
  32.         parray = new T[size];
  33.  
  34.         //создали копию указателя на начало выделенной памяти
  35.         T* pdest = parray;
  36.  
  37.         //создали копию указателя на начало его выделенной памяти
  38.         const T* psrc = v.parray;
  39.        
  40.         //и до тех пор пока не скопировали length элементов - копируем элементы
  41.         while (pdest < parray + length)
  42.             *pdest++ = *psrc++;
  43.     }
  44.  
  45.     //деструктор - освобождает память (иначе память утечет, останемся юез оперативной памяти)
  46.     ~my_vector() {
  47.         if (size)
  48.             delete[] parray;
  49.     }
  50.    
  51.     //оператор копирующего присваивания
  52.     const my_vector& operator=(const my_vector& v)
  53.     {
  54.         if (size)
  55.             delete[] parray;
  56.  
  57.         size = v.size;
  58.         length = v.length;
  59.         block = v.block;
  60.  
  61.         parray = new T[size];
  62.         T* pdest = parray;
  63.         const T* psrc = v.parray;
  64.         while (pdest < parray + length)
  65.             *pdest++ = *psrc++;
  66.  
  67.         //возвращаем обновленный наш массив (массив - копию аргумента. При этом память наша и его- разные)
  68.         return *this;
  69.     }
  70.  
  71.     unsigned get_size()
  72.     {
  73.         return size;
  74.     }
  75.     unsigned get_len()
  76.     {
  77.         return length;
  78.     }
  79.  
  80.     void change_size(unsigned new_size)
  81.     {
  82.         if (!new_size)
  83.         {
  84.             delete[] parray;
  85.             parray = nullptr;
  86.             size = 0;
  87.             length = 0;
  88.             return;
  89.         }
  90.         new_size = calc_alloc(new_size);
  91.         T* pnewarray = new T[new_size];
  92.         T* pdest = pnewarray;
  93.         const T* psrc = parray;
  94.  
  95.         if (length > new_size)
  96.             length = new_size;
  97.  
  98.         while (pdest < pnewarray + length)
  99.             *pdest++ = *psrc++;
  100.  
  101.         if (size)
  102.             delete[] parray;
  103.  
  104.         parray = pnewarray;
  105.         size = new_size;
  106.     }
  107.     void change_block(unsigned new_block)
  108.     {
  109.         block = new_block;
  110.     }
  111.     void shrink()
  112.     {
  113.         change_size(length);
  114.     }
  115.     void erase(unsigned l)
  116.     {
  117.         if (l > length)
  118.             l = length;
  119.         length -= l;
  120.         //  for(T* p = parray + length; p < parray + length + l; ++p)
  121.         //   p->~T();
  122.     }
  123.     T& operator[](int index)
  124.     {
  125.         return parray[index];
  126.     }
  127.     T& at(int index)
  128.     {
  129.         if ((unsigned)index < length && index >= 0)
  130.             return parray[index];
  131.         else
  132.         {
  133.             std::out_of_range err("my_vector::at()");
  134.             throw err;
  135.         }
  136.     }
  137.     T& push(T elem, unsigned index);
  138.  
  139.     T& push_front(T elem)
  140.     {
  141.         return push(elem, 0);
  142.     }
  143.     T& push_back(T elem)
  144.     {
  145.         return push(elem, length);
  146.     }
  147.     T pull(unsigned index)
  148.     {
  149.         T elem = parray[index];
  150.  
  151.         if (index >= length)
  152.             index = length - 1;
  153.  
  154.         T* pdest = parray + index;
  155.         T const* psrc = pdest + 1;
  156.  
  157.         while (psrc < parray + length)
  158.             *pdest++ = *psrc++;
  159.  
  160.         erase(1);
  161.  
  162.         return elem;
  163.     }
  164.     T pull_front()
  165.     {
  166.         return pull(0);
  167.     }
  168.     T pull_back()
  169.     {
  170.         return pull(length - 1);
  171.     }
  172. };
  173.  
  174. template<typename T>
  175. T& my_vector<T>::push(T elem, unsigned index)
  176. {
  177.     if (index > length)
  178.         index = length;
  179.     if (length + 1 > size)
  180.     {
  181.         unsigned new_size = calc_alloc(length + 1);
  182.         T* pnewarray = new T[new_size];
  183.         T* pdest = pnewarray;
  184.         const T* psrc = parray;
  185.  
  186.         while (pdest < pnewarray + index)
  187.             *pdest++ = *psrc++;
  188.  
  189.         *pdest++ = elem;
  190.  
  191.         while (psrc < parray + length)
  192.             *pdest++ = *psrc++;
  193.  
  194.         delete[] parray;
  195.  
  196.         parray = pnewarray;
  197.         size = new_size;
  198.     }
  199.     else
  200.     {
  201.         T* pdest = parray + length;
  202.         T const* psrc = pdest - 1;
  203.  
  204.         while (psrc >= parray + index)
  205.             *pdest-- = *psrc--;
  206.  
  207.         *pdest = elem;
  208.     }
  209.     ++length;
  210.     return parray[index];
  211. }
  212.  
  213.  
  214. int main()
  215. {
  216.     my_vector<int> v;
  217.     v.
  218.  
  219.     v.push_back(3);
  220.     v.push_back(7);
  221.     v.push_back(7);
  222.     v.push_back(7);
  223.     v.push_back(7);
  224.     v.push_back(7);
  225.     v.push_back(7);
  226.  
  227.     // my_vector<int>* pa = &v;
  228.  
  229.     v.push_back(7);
  230.  
  231.     // my_vector<int> w(v)
  232.     // my_vector<int> w = v;
  233.     my_vector<int> w;
  234.     w = v;
  235.  
  236.     v.push_back(7);
  237.     v.push_back(7);
  238.     v.push_back(7);
  239.     v.push_back(7);
  240.  
  241.     v.push(11, 1);
  242.  
  243.     v.push_front(-1);
  244.  
  245.     for (unsigned i = 0; i < v.get_len(); i++)
  246.     {
  247.         std::cout << v[i] << ' ';
  248.     }
  249.  
  250.     v.erase(5);
  251.     for (unsigned i = 0; i < v.get_len(); i++)
  252.     {
  253.         std::cout << v[i] << ' ';
  254.     }
  255.  
  256.     v.shrink();
  257.  
  258.  
  259.     my_vector<std::string> vs;
  260.  
  261.     vs.push_back("3s");
  262.     vs.push_back("7s");
  263.  
  264.     vs.push("11s", 1);
  265.  
  266.     vs.push_front("-1s");
  267.  
  268.     vs.erase(1);
  269.     vs.pull(1);
  270.  
  271.     for (unsigned i = 0; i < vs.get_len(); i++)
  272.     {
  273.         std::cout << vs[i] << ' ';
  274.     }
  275.  
  276.     try
  277.     {
  278.         vs.at(77);
  279.     }
  280.     catch (std::out_of_range& e)
  281.     {
  282.         std::cout << "out of range " << e.what();
  283.     }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement