Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. //Array.h
  2. #pragma once
  3. #ifndef ARRAY_H
  4. #define ARRAY_H
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. template <typename TYPE> struct Array
  10. {
  11.     //поля
  12. private:
  13.     int size, beginData, endData;             //длина, начало и конец массива
  14.     TYPE* data;                               //данные массива
  15.     void create(int mem, int len, int begin); //функция создания массива
  16. public:
  17.     //конструкторы/деструктор
  18.     Array();      //конструктор без параметров
  19.     Array(int n); //конструктор с параметрами
  20.     ~Array();     //деструктор
  21.  
  22.     //методы
  23.     int length();             //длина массива
  24.     Array& clear();           //очистить массив
  25.     Array& init(int n);       //инициализировать массив
  26.     Array& pushFront(TYPE x); //вставить элемент в начало массива
  27.     Array& pushBack(TYPE x);  //вставить элемент в конец массива
  28.     TYPE popFront();          //взять начальный элемент массива
  29.     TYPE popBack();           //взять конечный элемент массива
  30.  
  31.     //перегрузка оператора индексирования
  32.     TYPE& operator [] (int i);
  33. };
  34. //конструкторы/деструктор
  35.  
  36. //конструктор без параметров
  37. template <typename TYPE> Array<TYPE>::Array()
  38. {
  39.     create(1, 0, 0);
  40. }
  41. //конструктор с параметрами
  42. template <typename TYPE> Array<TYPE>::Array(int n)
  43. {
  44.     create(n, n, 0);
  45. }
  46. //деструктор
  47. template <typename TYPE> Array<TYPE>::~Array()
  48. {
  49.     delete[] data;
  50. }
  51.  
  52. //методы
  53.  
  54. //длина массива
  55. template <typename TYPE> int Array<TYPE>::length()
  56. {
  57.     return endData - beginData;
  58. }
  59. //создать массив
  60. template <typename TYPE> void Array<TYPE>::create(int mem, int len, int begin)
  61. {
  62.     if (mem < 1) { mem = 1; }
  63.     if (len < 0) { len = 0; }
  64.     size = mem;
  65.     beginData = begin;
  66.     endData = begin + len;
  67.     data = new TYPE[mem];
  68. }
  69. //очистить массив
  70. template <typename TYPE> Array<TYPE>& Array<TYPE>::clear()
  71. {
  72.     delete[] data;
  73.     create(1, 0, 0);
  74.     return *this;
  75. }
  76. //инициализировать массив
  77. template <typename TYPE> Array<TYPE>& Array<TYPE>::init(int n)
  78. {
  79.     delete[] data;
  80.     create(n, n, 0);
  81.     return *this;
  82. }
  83. //вставить элемент в начало массива
  84. template <typename TYPE> Array<TYPE>& Array<TYPE>::pushFront(TYPE x)
  85. {
  86.     if (beginData == 0)
  87.     {
  88.         TYPE* temp = data;
  89.         create(size + length() / 2 + 1, length(), beginData + length() / 2 + 1);
  90.         for (int i = 0; i < length(); ++i)
  91.         {
  92.             data[beginData + i] = temp[i];
  93.         }
  94.         delete[] temp;
  95.     }
  96.     --beginData;
  97.     data[beginData] = x;
  98.     return *this;
  99. }
  100. //вставить элемент в конец массива
  101. template <typename TYPE> Array<TYPE>& Array<TYPE>::pushBack(TYPE x)
  102. {
  103.     if (endData == size)
  104.     {
  105.         TYPE* temp = data;
  106.         create((size + length()) / 2 + 1, length(), beginData);
  107.         for (int i = beginData; i < endData; ++i)
  108.         {
  109.             data[i] = temp[i];
  110.         }
  111.         delete[] temp;
  112.     }
  113.     data[endData] = x;
  114.     ++endData;
  115.     return *this;
  116. }
  117. //взять начальный элемент массива
  118. template <typename TYPE> TYPE Array<TYPE>::popFront()
  119. {
  120.     if (beginData > length())
  121.     {
  122.         TYPE* temp = data;
  123.         int beginTemp = beginData;
  124.         create(size - beginData, length(), 0);
  125.         for (int i = 0; i < length(); ++i)
  126.         {
  127.             data[i] = temp[beginTemp + i];
  128.         }
  129.         delete[] temp;
  130.     }
  131.     if (length() > 0)
  132.     {
  133.         ++beginData;
  134.     }
  135.     return data[beginData - 1];
  136. }
  137. //взять конечный элемент массива
  138. template <typename TYPE> TYPE Array<TYPE>::popBack()
  139. {
  140.     if (size - endData > length())
  141.     {
  142.         TYPE* temp = data;
  143.         int beginTemp = beginData;
  144.         create(endData, length(), beginData);
  145.         for (int i = beginData; i < endData; ++i)
  146.         {
  147.             data[i] = temp[i];
  148.         }
  149.         delete[] temp;
  150.     }
  151.     if (length() > 0)
  152.     {
  153.         --endData;
  154.     }
  155.     return data[endData];
  156. }
  157.  
  158. //перегрузка оператора индексирования
  159. template <typename TYPE> TYPE& Array<TYPE>::operator[] (int i)
  160. {
  161.     if (i < 0) { i = 0; }
  162.     else if (i >= length()) { i = length() - 1; }
  163.     return data[beginData + i];
  164. }
  165. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement