Advertisement
Sanlover

Untitled

Jan 10th, 2021
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. using namespace std;
  4. const int mincapacity = 10;
  5. const int percent = 65;
  6.  
  7. template <typename T> class Iterator;
  8.  
  9. template <typename T>
  10. struct Node {
  11. T item;
  12. Node* next;
  13. Node* prev;
  14. Node(const T& a, Node* _next, Node* _prev) : item(a), next(_next), prev(_prev) {}
  15. Node() {}
  16. };
  17.  
  18. template <typename T>
  19. class Array
  20. {
  21. friend class Iterator<T>;
  22. int count;
  23. Node<T>* Head;
  24. Node<T>* Tail;
  25. Node<T>* capacity_last;
  26. int capacity;
  27. Iterator<T> head, tail;
  28.  
  29. void iterator_update()
  30. {
  31. head = Iterator<T>(Head);
  32. tail = Iterator<T>(Tail);
  33. }
  34. public:
  35. Array()
  36. {
  37. count = 0;
  38. Head = Tail = capacity_last = NULL;
  39. capacity = 0;
  40. head = Iterator<T>(Head);
  41. tail = Iterator<T>(Tail);
  42. }
  43. Array(const int n)
  44. {
  45. count = 0;
  46. Head = Tail = capacity_last = NULL;
  47. capacity = 0;
  48. for (int i = 0; i < n; i++)
  49. push_back(T());
  50. }
  51. Array(const T& Item, const int n)
  52. {
  53. count = 0;
  54. Head = Tail = capacity_last = NULL;
  55. capacity = 0;
  56. for (int i = 0; i < n; i++)
  57. push_back(Item);
  58. }
  59.  
  60. void push_back(const T& _item)
  61. {
  62. if (empty())
  63. {
  64. Head = Tail = new Node<T>(_item, NULL, NULL);
  65. capacity_last = Head;
  66. Change_cap(mincapacity);
  67. }
  68. else
  69. {
  70. if (Head != Tail)
  71. {
  72. Tail->next->item = _item;
  73. Tail->next->prev = Tail;
  74. Tail = Tail->next;
  75. }
  76. else
  77. {
  78. Tail = Head->next;
  79. Tail->item = _item;
  80. Tail->prev = Head;
  81. Head->next = Tail;
  82. }
  83. }
  84. count++;
  85. if (get_percent() > percent)
  86. {
  87. int newcapacity = capacity * 2;
  88. Change_cap(newcapacity);
  89. }
  90. iterator_update();
  91. }
  92. void push_front(const T& _item)
  93. {
  94. if (empty())
  95. {
  96. Head = Tail = new Node<T>(_item, nullptr, nullptr);
  97. capacity_last = Head;
  98. Change_cap(mincapacity);
  99. }
  100. else
  101. {
  102. if (Head != Tail)
  103. {
  104. Node<T>* next = Head;
  105. Head = new Node<T>(_item, next, nullptr);
  106. }
  107. else {
  108. Head = new Node<T>(_item, Tail, nullptr);
  109. Tail->prev = Head;
  110. }
  111. }
  112. count++;
  113. if (get_percent() > percent)
  114. {
  115. int newcapacity = capacity * 2;
  116. Change_cap(newcapacity);
  117. }
  118. iterator_update();
  119. }
  120.  
  121. int pop_back()
  122. {
  123. if (empty())
  124. return 0;
  125. else
  126. {
  127. if (Tail->prev != nullptr)
  128. {
  129. Tail->item = T();
  130. Tail = Tail->prev;
  131. }
  132. else
  133. {
  134. Tail->item = T();
  135. Head = Tail = nullptr;
  136. }
  137. }
  138. count--;
  139. iterator_update();
  140. }
  141. int pop_front()
  142. {
  143. if (empty())
  144. return 0;
  145. else
  146. {
  147. if (Head != Tail)
  148. {
  149. Node<T>* next = Head->next;
  150. delete Head;
  151. Head = next;
  152. Head->prev = nullptr;
  153. capacity--;
  154. Change_cap(capacity + 1);
  155. }
  156. else
  157. {
  158. Head->item = T();
  159. Head = Tail = nullptr;
  160. }
  161. }
  162. count--;
  163. iterator_update();
  164. }
  165.  
  166. bool empty()
  167. {
  168. return Head == NULL;
  169. }
  170.  
  171. double get_percent() const
  172. {
  173. return count / (capacity / 100.0);
  174. }
  175. int get_length()
  176. {
  177. return count;
  178. }
  179. int get_capacity()
  180. {
  181. return capacity;
  182. }
  183.  
  184. void Change_cap(const int Newcapacity)
  185. {
  186. Node<T>* cap = capacity_last;
  187. for (int i = capacity; i < Newcapacity; i++)
  188. {
  189. cap->next = new Node<T>(T(), NULL, cap);
  190. cap = cap->next;
  191. capacity_last = cap;
  192. }
  193. capacity = Newcapacity;
  194. }
  195.  
  196. T& operator[] (const int id)
  197. {
  198. Node<T>* it = Head;
  199. for (int i = 0; i < id; i++)
  200. it = it->next;
  201. return it->item;
  202. }
  203.  
  204. void clear()
  205. {
  206. while (!empty())
  207. pop_back();
  208. }
  209.  
  210. Iterator<T> begin()
  211. {
  212. return head;
  213. }
  214. Iterator<T> end()
  215. {
  216. return tail;
  217. }
  218.  
  219. T& front()
  220. {
  221. return *begin();
  222. }
  223. T& back()
  224. {
  225. Iterator<T> it = end();
  226. --it;
  227. return *it;
  228. }
  229.  
  230. void insert(Iterator<T> it, const T& r)
  231. {
  232. Node<T>* el = it.elem;
  233. if (it == end())
  234. push_back(r);
  235. else
  236. {
  237. Node<T>* nextel = it.elem->next;
  238. Node<T>* p = new Node<T>(r, nullptr, nullptr);
  239. p->next = nextel;
  240. p->prev = el;
  241. nextel->prev = p;
  242. el->next = p;
  243. ++count;
  244. }
  245. }
  246. void erase(Iterator<T> it)
  247. {
  248. Node<T>* el = it.elem;
  249. if (it == begin())
  250. pop_front();
  251. else
  252. if (it == end())
  253. pop_back();
  254. else
  255. {
  256. Node<T>* prevel = it.elem->prev;
  257. Node<T>* nextel = it.elem->next;
  258. prevel->next = nextel;
  259. nextel->prev = prevel;
  260. delete el;
  261. --count;
  262. }
  263. }
  264. };
  265. template<typename T>
  266. class Iterator
  267. {
  268. public:
  269. Node<T>* elem;
  270. Iterator(Node<T>* el) :elem(el) {}
  271. Iterator() :elem(0) {}
  272. Iterator(const Iterator& it) :elem(it.elem) {}
  273.  
  274. Iterator& operator++()
  275. {
  276. if (elem != 0)
  277. elem = elem->next;
  278. return *this;
  279. }
  280. Iterator& operator--()
  281. {
  282. if (elem != 0)
  283. elem = elem->prev;
  284. return *this;
  285. }
  286.  
  287. bool operator== (const Iterator& it)
  288. {
  289. return (elem == it.elem);
  290. }
  291. bool operator!= (const Iterator& it)
  292. {
  293. return (elem != it.elem);
  294. }
  295. };
  296. int main()
  297. {/*
  298. SetConsoleCP(1251);
  299. SetConsoleOutputCP(1251);
  300. int size;
  301. cout << "Введите размер: ";
  302. cin >> size;
  303. Array<int> map(size);
  304. cout << "Заполните массив: ";
  305. for (int i = 0; i < map.get_length(); i++)
  306. {
  307. cin >> map[i];
  308. }
  309. char check;
  310. do
  311. {
  312. cout << "Выберите действие: " << endl;
  313. cout << "1 - Добавить элемент в конец" << endl;
  314. cout << "2 - Добавить элемент в начало" << endl;
  315. cout << "3 - Удалить элемент с конца" << endl;
  316. cout << "4 - Удалить элемент из начала" << endl;
  317. cout << "5 - Посмотреть размер" << endl;
  318. cout << "6 - Посмотреть capacity" << endl;
  319. cout << "7 - Очистить" << endl;
  320. cout << "8 - Показать массив" << endl;
  321. cout << "0 - Выход" << endl;
  322. cout << "Ваш выбор: ";
  323. cin >> check;
  324. char check1;
  325. switch (check)
  326. {
  327. case '1':
  328. {
  329. system("cls");
  330. int k;
  331. cout << "Введите число, которое будем вводить: ";
  332. cin >> k;
  333. map.push_back(k);
  334. }break;
  335. case '2':
  336. {
  337. system("cls");
  338. int k;
  339. cout << "Введите число, которое будем вводить: ";
  340. cin >> k;
  341. map.push_front(k);
  342. }break;
  343. case '3':
  344. {
  345. if (map.pop_back() == 0)
  346. return 0;
  347. }break;
  348. case '4':
  349. {
  350. if (map.pop_front() == 0)
  351. return 0;
  352. }break;
  353. case '5':
  354. {
  355. system("cls");
  356. cout << "Размер: " << map.get_length() << endl;
  357. }break;
  358. case '6':
  359. {
  360. system("cls");
  361. cout << "Capacity: " << map.get_capacity() << endl;
  362. }break;
  363. case '7':
  364. {
  365. map.clear();
  366. }break;
  367. case '8':
  368. {
  369. system("cls");
  370. cout << endl << "Массив: ";
  371. for (size_t i = 0; i < map.get_length(); i++)
  372. {
  373. cout << map[i] << '\t';
  374. }
  375. cout << endl;
  376. }break;
  377. }
  378. } while (check != '0');*/
  379.  
  380. Array<int> s;
  381. s.push_back(5);
  382. s.push_back(6);
  383. s.push_back(7);
  384. s.push_back(8);
  385. for (int i = 0; i < s.get_length(); i++)
  386. cout << s[i] << " ";
  387. Iterator<int> it = s.begin();
  388. for (int i = 0; i < 0; i++)
  389. ++it;
  390.  
  391. s.erase(it);
  392. it = s.begin();
  393. for (int i = 0; i < 1; i++)
  394. ++it;
  395. cout << endl;
  396. for (int i = 0; i < s.get_length(); i++)
  397. cout << s[i] << " ";
  398. s.insert(it, 5);
  399. cout << endl;
  400. for (int i = 0; i < s.get_length(); i++)
  401. cout << s[i] << " ";
  402. return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement