avr39ripe

cppDynArrayGittAndriyVer

Aug 20th, 2021
882
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Задание 1
  2. Создать шаблонный класс-контейнер Array, который представляет собой массив,
  3. позволяющий хранить объекты заданного типа.
  4. Класс должен реализовывать следующие функции:
  5. ■ GetSize – получение размера массива (количество элементов,
  6. под которые выделена память);
  7. ■ SetSize(int size, int grow = 1) – установка размера массива
  8. (если параметр size больше предыдущего размера массива, то
  9. выделяется дополнительный блок памяти, если нет, то «лишние» элементы теряются
  10. и память освобождается); параметр grow определяет для какого количества элементов
  11. необходимо выделить память, если количество элементов превосходит текущий размер
  12. массива. Например, SetSize(5, 5); означает, что при добавлении 6-го элемента размер
  13. массива становится равным 10, при добавлении 11-го - 15 и т. д.;
  14. ■ GetUpperBound - получение последнего допустимого индекса в массиве. Например,
  15. если при размере массива 10, вы добавляете в него 4 элемента, то функция вернет 3;
  16. ■ IsEmpty - массив пуст?;
  17. ■ FreeExtra - удалить «лишнюю» память (выше последнего допустимого индекса);
  18. ■ RemoveAll – удалить все;
  19. ■ GetAt -получение определенного элемента (по индексу);
  20. ■ SetAt – установка нового значения для определенного элемента (индекс элемента должен
  21. быть меньше текущего размера массива);
  22. ■ operator [] – для реализации двух предыдущих функций;
  23. ■ Add – добавление элемента в массив (при необходимости
  24. массив увеличивается на значение grow функции SetSize);
  25. ■ Append – «сложение» двух массивов;
  26. ■ operator =;
  27. ■ GetData – получения адреса массива с данными;
  28. ■ InsertAt – вставка элемента(-ов) в заданную позицию;
  29. ■ RemoveAt – удаление элемента(-ов) с заданной позиции.
  30.  
  31. Реализовать сематнику копирования, перемещения, const-семантику!!!
  32.  
  33. #include <iostream>
  34.  
  35. template<typename ElemT>
  36. class Array
  37. {
  38.     ElemT* arr;
  39.     size_t capacity;
  40.     size_t currentSize;
  41. public:
  42.     Array(size_t capacityP) : arr{ new ElemT[capacityP] }, capacity{ capacityP }, currentSize{0}{}
  43.     Array() : Array(5) {}
  44.     Array(const Array& object);
  45.     Array(Array&& object);
  46.  
  47.     Array& operator=(const Array& object);
  48.     Array& operator=(Array&& object);
  49.  
  50.     size_t getSize()const { return capacity; }
  51.  
  52.     void setSize(size_t newCurrentSize, size_t grow = 5)
  53.     {
  54.         if (!(newCurrentSize > currentSize and newCurrentSize < capacity))
  55.         {
  56.             if (newCurrentSize > capacity) { capacity = newCurrentSize + grow; }
  57.             else if (newCurrentSize < currentSize) { capacity = newCurrentSize; }
  58.             auto newArr{ new ElemT[capacity] };
  59.             for (size_t i{ 0 }; i < currentSize; ++i)
  60.             {
  61.                 *(newArr + i) = *(arr + i);
  62.             }
  63.             delete[] arr;
  64.             arr = newArr;
  65.         }
  66.         currentSize = newCurrentSize;
  67.     }
  68.  
  69.     size_t getUpperBound()const { return currentSize - 1; }
  70.  
  71.     bool isEmpty()const { return currentSize == 0 ? true : false; }
  72.  
  73.     void freeExtra();
  74.     void removeAll();
  75.  
  76.     //ElemT& getAt(size_t idx)const { return *(arr + idx); }
  77.     //bool setAt(size_t idx, const ElemT& val)
  78.     //{
  79.     //  if (idx < currentSize) { *(arr + idx) = val; return true; }
  80.     //  else { return false; }
  81.     //}
  82.  
  83.     ElemT& operator[](size_t idx) { return*(arr + idx); }
  84.     const ElemT& operator[](size_t idx)const { return *(arr + idx); }
  85.  
  86.     void add(const ElemT& val);
  87.     void insertAt(size_t insertIdx, const ElemT& val);
  88.     void removeAt(size_t removeIdx);
  89.     void append(const Array& object);
  90.  
  91.     ElemT* getData()const { return arr; }
  92.  
  93.     template <typename ElemT>
  94.     friend std::ostream& operator<<(std::ostream& out, const Array<ElemT>& object);
  95.     template <typename ElemT>
  96.     friend std::istream& operator>>(std::istream& in, const Array<ElemT>& object);
  97.  
  98.     void randomize();
  99.  
  100.     ~Array() { delete[]arr; }
  101. };
  102.  
  103. template <typename ElemT>
  104. Array<ElemT>::Array(const Array& object)
  105.     : arr{ new ElemT[object.capacity] }, capacity{ object.capacity }, currentSize{ object.currentSize }
  106. {
  107.     for (size_t i{ 0 }; i < currentSize; ++i)
  108.     {
  109.         *(arr + i) = *(object.arr + i);
  110.     }
  111. }
  112.  
  113. template <typename ElemT>
  114. Array<ElemT>::Array(Array&& object)
  115.     : arr{ object.arr }, capacity{ object.capacity }, currentSize{ object.currentSize }
  116. {
  117.     object.arr = nullptr;
  118.     object.capacity = 0;
  119.     object.currentSize = 0;
  120. }
  121.  
  122. template <typename ElemT>
  123. Array<ElemT>& Array<ElemT>::operator=(const Array& object)
  124. {
  125.     if (!(this == &object))
  126.     {
  127.         if (capacity != object.capacity)
  128.         {
  129.             delete[] arr;
  130.             arr = new ElemT[object.capacity];
  131.         }
  132.         capacity = object.capacity;
  133.         currentSize = object.currentSize;
  134.         for (size_t i{ 0 }; i < currentSize; ++i)
  135.         {
  136.             *(arr + i) = *(object.arr + i);
  137.         }
  138.     }
  139.     return *this;
  140. }
  141.  
  142. template <typename ElemT>
  143. Array<ElemT>& Array<ElemT>::operator=(Array&& object)
  144. {
  145.     if (!(this == &object))
  146.     {
  147.         delete[] arr;
  148.         arr = object.arr;
  149.         capacity = object.capacity;
  150.         currentSize = object.currentSize;
  151.  
  152.         object.arr = nullptr;
  153.         object.capacity = 0;
  154.         object.currentSize = 0;
  155.     }
  156.     return *this;
  157. }
  158.  
  159. template <typename ElemT>
  160. void Array<ElemT>::freeExtra()
  161. {
  162.     capacity = currentSize;
  163.     auto newArr{ new ElemT[capacity] };
  164.     for (size_t i{ 0 }; i < currentSize; ++i)
  165.     {
  166.         *(newArr + i) = *(arr + i);
  167.     }
  168.     delete[] arr;
  169.     arr = newArr;
  170. }
  171.  
  172. template <typename ElemT>
  173. void Array<ElemT>::removeAll()
  174. {
  175.     for (; currentSize; --currentSize)
  176.     {
  177.         arr[currentSize - 1] = 0;
  178.     }
  179. }
  180.  
  181. template <typename ElemT>
  182. void Array<ElemT>::add(const ElemT& val)
  183. {
  184.     setSize(currentSize + 1);
  185.     *(arr + currentSize - 1) = val;
  186. }
  187.  
  188. template <typename ElemT>
  189. void Array<ElemT>::insertAt(size_t insertIdx, const ElemT& val)
  190. {
  191.     setSize(currentSize + 1);
  192.     for (size_t i{ currentSize - 1 }; i > insertIdx; --i)
  193.     {
  194.         *(arr + i) = *(arr + i - 1);
  195.     }
  196.     *(arr + insertIdx) = val;
  197. }
  198.  
  199. template <typename ElemT>
  200. void Array<ElemT>::removeAt(size_t removeIdx)
  201. {
  202.     for (size_t i{ removeIdx }; i < currentSize; ++i)
  203.     {
  204.         *(arr + i) = *(arr + i + 1);
  205.     }
  206.     --currentSize;
  207. }
  208.  
  209. template <typename ElemT>
  210. void Array<ElemT>::append(const Array& object)
  211. {
  212.     size_t oldSize{ currentSize };
  213.     setSize(currentSize + object.currentSize);
  214.     for (size_t i{ oldSize }, j{ 0 }; i < currentSize; ++i, ++j)
  215.     {
  216.         *(arr + i) = *(object.arr + j);
  217.     }
  218. }
  219.  
  220. template <typename ElemT>
  221. std::ostream& operator<<(std::ostream& out, const Array<ElemT>& object)
  222. {
  223.     if (!object.capacity and !object.arr) { out << "[EMPTY]\n"; return out; }
  224.  
  225.     for (size_t i{ 0 }; i < object.currentSize; ++i)
  226.     {
  227.         out << *(object.arr + i) << ' ';
  228.     }
  229.     out << '\n';
  230.  
  231.     return out;
  232. }
  233.  
  234. template <typename ElemT>
  235. std::istream& operator>>(std::istream& in, const Array<ElemT>& object)
  236. {
  237.     if (!object.capacity and !object.arr) { std::cout << "[EMPTY]\n"; return in; }
  238.  
  239.     std::cout << "Enter array elements one by one\n";
  240.     for (size_t i{ 0 }; i < object.currentSize; ++i)
  241.     {
  242.         in >> *(object.arr + i);
  243.     }
  244.  
  245.     return in;
  246. }
  247.  
  248. template <typename ElemT>
  249. void Array<ElemT>::randomize()
  250. {
  251.     for (; currentSize < capacity; ++currentSize)
  252.     {
  253.         arr[currentSize] = rand() % 10;
  254.     }
  255. }
  256.  
  257. template <typename ElemT>
  258. Array<ElemT> arrayFactory(size_t arrSize)
  259. {
  260.     Array<ElemT> arrObject{ arrSize };
  261.     arrObject.randomize();
  262.     return arrObject;
  263. }
  264.  
  265. int main()
  266. {
  267.     Array<int> arr_1;
  268.     arr_1 = arrayFactory<int>(5);
  269.     std::cout << "\033[1;34m" << "Array #1:\n" << "\033[0m" << arr_1;
  270.  
  271.     std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
  272.     std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
  273.     std::cout << "Is Array #1 empty ? " << std::boolalpha << arr_1.isEmpty() << '\n';
  274.     std::cout << "\nArray's #1 data is - " << arr_1.getData() << '\n';
  275.  
  276.     std::cout << "\nChange array's #1 element:\n";
  277.     arr_1[3] = 33;
  278.     std::cout << arr_1;
  279.    
  280.     std::cout << "\nAdd element in array #1:\n";
  281.     arr_1.add(55);
  282.     std::cout << arr_1;
  283.     std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
  284.     std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
  285.  
  286.     std::cout << "\nInsert element in array #1:\n";
  287.     arr_1.insertAt(2, 77);
  288.     std::cout << arr_1;
  289.     std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
  290.     std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
  291.    
  292.     std::cout << "\nRemove element from array #1:\n";
  293.     arr_1.removeAt(2);
  294.     std::cout << arr_1;
  295.     std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
  296.     std::cout << "The last valid index is - " << arr_1.getUpperBound() << '\n';
  297.    
  298.     std::cout << "\nFree up extra memory array #1\n";
  299.     arr_1.freeExtra();
  300.     std::cout << arr_1;
  301.     std::cout << "Array capacity is " << arr_1.getSize() << " elements\n";
  302.     std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
  303.     std::cout << '\n';
  304.  
  305.     Array<int> arr_2;
  306.     arr_2 = arrayFactory<int>(10);
  307.     std::cout << "\033[1;34m" << "Array #2:\n" << "\033[0m" << arr_2;
  308.     std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
  309.     std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
  310.     std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
  311.  
  312.     std::cout << "\033[1;33m" << "\nAdding two arrays (array #1 + array #2):\n" << "\033[0m";
  313.     arr_1.append(arr_2);
  314.     std::cout << arr_1;
  315.     std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
  316.     std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
  317.     std::cout << "\nArray's #1 data is - " << arr_1.getData() << '\n';
  318.  
  319.     std::cout << "\nRemoving all element from array #2:\n";
  320.     arr_2.removeAll();
  321.     std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
  322.     std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
  323.     std::cout << "Is Array #2 empty ? " << std::boolalpha << arr_2.isEmpty() << '\n';
  324.     std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
  325.     std::cout << '\n';
  326.    
  327.     arr_2 = arrayFactory<int>(10);
  328.     std::cout << arr_2;
  329.     std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
  330.     std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
  331.     std::cout << "Is Array #2 empty ? " << std::boolalpha << arr_2.isEmpty() << '\n';
  332.     std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
  333.  
  334.  
  335.     return 0;
  336. }
  337.  
RAW Paste Data