Advertisement
Guest User

vector.h

a guest
Aug 3rd, 2022
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.99 KB | None | 0 0
  1. #ifndef VECTOR_H
  2. #define VECTOR_H
  3.  
  4. #include <iterator>
  5. #include <cstddef>
  6. #include <string>
  7. #include <type_traits>
  8. #include <utility>
  9. #include <initializer_list>
  10.  
  11. template<typename T>
  12. class vector
  13. {
  14. public:
  15. typedef T value_type;
  16. typedef value_type* iterator;
  17. typedef const value_type* const_iterator;
  18. typedef value_type& reference;
  19. typedef const value_type& const_reference;
  20. typedef std::reverse_iterator<iterator> reverse_iterator;
  21. typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
  22. typedef std::size_t size_type;
  23. typedef std::ptrdiff_t difference_type;
  24.  
  25. explicit vector() : __base(nullptr), __size(0), __capacity(0) {}
  26. explicit vector(size_type n) : __base(nullptr), __size(n), __capacity(__size << 1)
  27. {
  28. __base = new value_type[__capacity];
  29. for(size_type __c = 0; __c != __size; ++__c)
  30. __base[__c] = value_type{};
  31. }
  32. explicit vector(size_type n, const value_type& val) : __base(nullptr), __size(n), __capacity(__size << 1)
  33. {
  34. __base = new value_type[__capacity];
  35. for(size_type __c = 0; __c != __size; ++__c)
  36. __base[__c] = val;
  37. }
  38.  
  39. vector(const vector& x) : __size(x.__size), __capacity(x.__capacity)
  40. {
  41. delete [] __base;
  42. __base = new value_type[__capacity];
  43. for(size_type __c = 0; __c != __size; ++__c)
  44. __base[__c] = x.__base[__c];
  45. }
  46. vector(vector&& x) : __base(std::move(x.__base)), __size(std::move(x.__size)), __capacity(std::move(x.__capacity))
  47. {
  48. x.__base = nullptr;
  49. x.__size = 0;
  50. x.__capacity = 0;
  51. }
  52. vector(std::initializer_list<value_type> il) : __size(il.size()), __capacity(__size << 1)
  53. {
  54. delete [] __base;
  55. __base = new value_type[__capacity];
  56. typename std::initializer_list<value_type>::iterator itr = il.begin();
  57. typename std::initializer_list<value_type>::iterator end = il.end();
  58. for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
  59. __base[__c] = *itr;
  60. }
  61.  
  62. ~vector()
  63. {
  64. delete [] __base;
  65. __size = 0;
  66. __capacity = 0;
  67. }
  68.  
  69. vector& operator=(const vector& x)
  70. {
  71. delete [] __base;
  72. __base = new value_type[__capacity];
  73. __size = x.__size;
  74. __capacity = x.__capacity;
  75. for(size_type __c = 0; __c != __size; ++__c)
  76. __base[__c] = x.__base[__c];
  77. return *this;
  78. }
  79. vector& operator=(vector&& x)
  80. {
  81. __base = std::move(x.__base);
  82. __size = std::move(x.__size);
  83. __capacity = std::move(x.__capacity);
  84. x.__base = nullptr;
  85. x.__size = 0;
  86. x.__capacity = 0;
  87. return *this;
  88. }
  89. vector& operator=(std::initializer_list<value_type> il)
  90. {
  91. delete [] __base;
  92. __base = new value_type[__capacity];
  93. __size = il.size();
  94. __capacity = (__size << 1);
  95. typename std::initializer_list<value_type>::iterator itr = il.begin();
  96. typename std::initializer_list<value_type>::iterator end = il.end();
  97. for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
  98. __base[__c] = *itr;
  99. return *this;
  100. }
  101.  
  102. iterator begin() noexcept { return iterator(std::addressof(__base[0])); }
  103. const_iterator begin() const noexcept { return const_iterator(std::addressof(__base[0])); }
  104.  
  105. iterator end() noexcept { return iterator(std::addressof(__base[__size])); }
  106. const_iterator end() const noexcept { return const_iterator(std::addressof(__base[__size])); }
  107.  
  108. reverse_iterator rbegin() noexcept { return reverse_iterator(std::addressof(__base[__size])); }
  109. const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(std::addressof(__base[__size])); }
  110.  
  111. reverse_iterator rend() noexcept { return reverse_iterator(std::addressof(__base[0])); }
  112. const_reverse_iterator rend() const noexcept { return const_reverse_iterator(std::addressof(__base[0])); }
  113.  
  114. const_iterator cbegin() const noexcept { return const_iterator(std::addressof(__base[0])); }
  115. const_iterator cend() const noexcept { return const_iterator(std::addressof(__base[__size])); }
  116.  
  117. const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(std::addressof(__base[__size])); }
  118. const_reverse_iterator crend() const noexcept { return const_reverse_iterator(std::addressof(__base[0])); }
  119.  
  120. size_type size() const noexcept { return __size; }
  121. size_type max_size() const noexcept {
  122. difference_type __PTRDIFF_T_MAX__ = 1;
  123. __PTRDIFF_T_MAX__ <<= ((sizeof(difference_type) * 8) - 1);
  124. return __PTRDIFF_T_MAX__ - 1;
  125. }
  126. size_type capacity() const noexcept { return __capacity; }
  127.  
  128. void resize(size_type n)
  129. {
  130. if(n < __size)
  131. {
  132. __size = n;
  133. std::destroy(std::addressof(__base[n]), std::addressof(__base[__size]));
  134. }
  135. else if(n == __size)
  136. return;
  137. else
  138. {
  139. if(__capacity < n)
  140. {
  141. __capacity = n;
  142. value_type* __tmp_base = new value_type[__capacity];
  143. for(size_type __c = 0; __c != __size; ++__c)
  144. __tmp_base[__c] = __base[__c];
  145. delete [] __base;
  146. __base = __tmp_base;
  147. }
  148. for(size_type __c = __size; __c != n; ++__c)
  149. __base[__c] = value_type{};
  150. __size = n;
  151. }
  152. }
  153. void resize(size_type n, const value_type& val)
  154. {
  155. if(n < __size)
  156. {
  157. __size = n;
  158. std::destroy(std::addressof(__base[n]), std::addressof(__base[__size]));
  159. }
  160. else if(n == __size)
  161. return;
  162. else
  163. {
  164. if(n > __capacity)
  165. {
  166. __capacity = n;
  167. value_type* __tmp_base = new value_type[__capacity];
  168. for(size_type __c = 0; __c != __size; ++__c)
  169. __tmp_base[__c] = __base[__c];
  170. delete [] __base;
  171. __base = __tmp_base;
  172. }
  173. for(size_type __c = __size; __c != n; ++__c)
  174. __base[__c] = val;
  175. __size = n;
  176. }
  177. }
  178.  
  179. void reserve(size_type n)
  180. {
  181. if(n > __capacity)
  182. {
  183. __capacity = n << 1;
  184. value_type* __tmp_base = new value_type[__capacity];
  185. for(size_type __c = 0; __c != __size; ++__c)
  186. __tmp_base[__c] = __base[__c];
  187. delete [] __base;
  188. __base = __tmp_base;
  189. }
  190. }
  191. void shrink_to_fit()
  192. {
  193. if(__capacity != __size)
  194. {
  195. __capacity = __size;
  196. std::destroy(std::addressof(__base[__size]), std::addressof(__base[__capacity]));
  197. }
  198. }
  199.  
  200. bool empty() const noexcept { return __size == 0 && begin() == end(); }
  201.  
  202. reference operator[](size_type n) { return __base[n]; }
  203. const_reference operator[](size_type n) const { return __base[n]; }
  204.  
  205. reference at(size_type n)
  206. {
  207. if(n < __size)
  208. return __base[n];
  209. else
  210. {
  211. std::string __prelouge = "vector::_M_range_check: __n (which is ";
  212. std::string __inlouge = ") >= this->size() (which is ";
  213. std::string __prolouge = ")";
  214. std::string msg = __prelouge + std::to_string(n) + __inlouge + std::to_string(__size) + __prolouge;
  215. throw std::out_of_range(msg);
  216. }
  217. }
  218. const_reference at(size_type n) const
  219. {
  220. if(n < __size)
  221. return __base[n];
  222. else
  223. {
  224. std::string __prelouge = "vector::_M_range_check: __n (which is ";
  225. std::string __inlouge = ") >= this->size() (which is ";
  226. std::string __prolouge = ")";
  227. std::string msg = __prelouge + std::to_string(n) + __inlouge + std::to_string(__size) + __prolouge;
  228. throw std::out_of_range(msg);
  229. }
  230. }
  231.  
  232. reference front() {
  233. if(empty())
  234. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  235. else
  236. return reference(__base[0]);
  237. }
  238. const_reference front() const
  239. {
  240. if(empty())
  241. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  242. else
  243. return const_reference(__base[0]);
  244. }
  245.  
  246. reference back()
  247. {
  248. if(empty())
  249. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  250. else
  251. return reference(__base[__size - 1]);
  252. }
  253. const_reference back() const
  254. {
  255. if(empty())
  256. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  257. else
  258. return reference(__base[__size - 1]);
  259. }
  260.  
  261. value_type* data() { return __base; }
  262. const value_type* data() const { return __base; }
  263.  
  264. void assign(size_type n, const value_type& val)
  265. {
  266. delete [] __base;
  267. __base = new value_type[__capacity];
  268. __size = n;
  269. __capacity = (__size << 1);
  270. for(size_type __c = 0; __c != __size; ++__c)
  271. __base[__c] = val;
  272. }
  273. void assign(std::initializer_list<value_type> il)
  274. {
  275. delete [] __base;
  276. __base = new value_type[__capacity];
  277. __size = il.size();
  278. __capacity = (__size << 1);
  279. typename std::initializer_list<value_type>::iterator itr = il.begin();
  280. typename std::initializer_list<value_type>::iterator end = il.end();
  281. for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
  282. __base[__c] = *itr;
  283. }
  284.  
  285. void push_back(const value_type& val)
  286. {
  287. if(__size == __capacity)
  288. {
  289. if(__size == 0) __capacity = 1;
  290. else __capacity = (__size << 1);
  291. value_type* __tmp_base = new value_type[__capacity];
  292. for(size_type __c = 0; __c != __size; ++__c)
  293. __tmp_base[__c] = __base[__c];
  294. delete [] __base;
  295. __base = __tmp_base;
  296. }
  297. __base[__size] = val;
  298. ++__size;
  299. }
  300. void push_back(value_type&& val)
  301. {
  302. if(__size == __capacity)
  303. {
  304. if(__size == 0) __capacity = 1;
  305. else __capacity = (__size << 1);
  306. value_type* __tmp_base = new value_type[__capacity];
  307. for(size_type __c = 0; __c != __size; ++__c)
  308. __tmp_base[__c] = __base[__c];
  309. delete [] __base;
  310. __base = __tmp_base;
  311. }
  312. __base[__size] = std::move(val);
  313. ++__size;
  314. }
  315.  
  316. void pop_back()
  317. {
  318. if(empty())
  319. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  320. else
  321. {
  322. std::destroy(std::addressof(__base[__size - 1]), std::addressof(__base[__size]));
  323. --__size;
  324. }
  325. }
  326.  
  327. iterator insert(const_iterator position, const value_type& val)
  328. {
  329. size_type __pos = position - begin();
  330. if(__size == __capacity)
  331. {
  332. if(__size == 0) __capacity = 1;
  333. else __capacity = (__size << 1);
  334. value_type* __tmp_base = new value_type[__capacity];
  335. for(size_type __c = 0; __c != __size; ++__c)
  336. __tmp_base[__c] = __base[__c];
  337. delete [] __base;
  338. __base = __tmp_base;
  339. }
  340. for(size_type __c = __size; __c != __pos; --__c)
  341. __base[__c] = __base[__c - 1];
  342. __base[__pos] = val;
  343. ++__size;
  344. return iterator(std::addressof(__base[__pos]));
  345. }
  346. iterator insert(const_iterator position, value_type&& val)
  347. {
  348. size_type __pos = position - begin();
  349. if(__size == __capacity)
  350. {
  351. if(__size == 0) __capacity = 1;
  352. else __capacity = (__size << 1);
  353. value_type* __tmp_base = new value_type[__capacity];
  354. for(size_type __c = 0; __c != __size; ++__c)
  355. __tmp_base[__c] = __base[__c];
  356. delete [] __base;
  357. __base = __tmp_base;
  358. }
  359. for(size_type __c = __size; __c != __pos; --__c)
  360. __base[__c] = __base[__c - 1];
  361. __base[__pos] = std::move(val);
  362. ++__size;
  363. return iterator(std::addressof(__base[__pos]));
  364. }
  365. iterator insert(const_iterator position, size_type n, const value_type& val)
  366. {
  367. size_type __pos = position - begin();
  368. if(__size + n > __capacity)
  369. {
  370. if(__size == 0) __capacity = (n << 1);
  371. else __capacity = ((__size + n) << 1);
  372. value_type* __tmp_base = new value_type[__capacity];
  373. for(size_type __c = 0; __c != __size; ++__c)
  374. __tmp_base[__c] = __base[__c];
  375. delete [] __base;
  376. __base = __tmp_base;
  377. }
  378. for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
  379. __base[__c] = __base[__c - n];
  380. for(size_type __c = __pos; __c != (__pos + n); ++__c)
  381. __base[__c] = val;
  382. __size += n;
  383. return iterator(std::addressof(__base[__pos]));
  384. }
  385. iterator insert(const_iterator position, std::initializer_list<value_type> il)
  386. {
  387. size_type __pos = position - begin();
  388. size_type n = il.size();
  389. if(__size + n > __capacity)
  390. {
  391. if(__size == 0) __capacity = (n << 1);
  392. else __capacity = ((__size + n) << 1);
  393. value_type* __tmp_base = new value_type[__capacity];
  394. for(size_type __c = 0; __c != __size; ++__c)
  395. __tmp_base[__c] = __base[__c];
  396. delete [] __base;
  397. __base = __tmp_base;
  398. }
  399. for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
  400. __base[__c] = __base[__c - n];
  401. typename std::initializer_list<value_type>::iterator itr = il.begin();
  402. typename std::initializer_list<value_type>::iterator end = il.end();
  403. for(size_type __c = __pos; __c != (__pos + n) && itr != end; ++__c, ++itr)
  404. __base[__c] = *itr;
  405. __size += n;
  406. return iterator(std::addressof(__base[__pos]));
  407. }
  408. template<class InputIterator>
  409. typename std::enable_if<std::is_pointer<InputIterator>::value, iterator>::type
  410. insert(const_iterator position, InputIterator first, InputIterator last)
  411. {
  412. size_type __pos = position - begin();
  413. size_type n = last - first;
  414. if(__size + n > __capacity)
  415. {
  416. if(__size == 0) __capacity = (n << 1);
  417. else __capacity = ((__size + n) << 1);
  418. value_type* __tmp_base = new value_type[__capacity];
  419. for(size_type __c = 0; __c != __size; ++__c)
  420. __tmp_base[__c] = __base[__c];
  421. delete [] __base;
  422. __base = __tmp_base;
  423. }
  424. for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
  425. __base[__c] = __base[__c - n];
  426. iterator itr = first;
  427. for(size_type __c = __pos; __c != (__pos + n) && itr != last; ++__c, ++itr)
  428. __base[__c] = *itr;
  429. __size += n;
  430. return iterator(std::addressof(__base[__pos]));
  431. }
  432.  
  433. iterator erase(const_iterator position)
  434. {
  435. if(empty())
  436. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  437. else
  438. {
  439. size_type __pos = position - begin();
  440. for(size_type __c = __pos; __c != __size - 1; ++__c)
  441. __base[__c] = __base[__c + 1];
  442. --__size;
  443. return iterator(std::addressof(__base[__pos]));
  444. }
  445. }
  446. iterator erase(const_iterator first, const_iterator last)
  447. {
  448. if(empty())
  449. throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
  450. else
  451. {
  452. size_type n = last - first;
  453. size_type __pos = first - begin();
  454. for(size_type __c = __pos; __c != __size - n; ++__c)
  455. __base[__c] = __base[__c + n];
  456. __size -= n;
  457. return iterator(std::addressof(__base[__pos]));
  458. }
  459. }
  460.  
  461. void swap(vector& x)
  462. {
  463. if(*this == x) return;
  464. std::swap(*this, x);
  465. }
  466.  
  467. void clear() noexcept
  468. {
  469. if(__size == 0) return;
  470. delete [] __base;
  471. __base = new value_type[__capacity];
  472. __size = 0;
  473. }
  474.  
  475. bool operator==(const vector& rhs)
  476. {
  477. if(__size != rhs.__size) return false;
  478. for(size_type __c = 0; __c != __size; ++__c)
  479. if(__base[__c] != rhs.__base[__c])
  480. return false;
  481. return true;
  482. }
  483. bool operator!=(const vector& rhs)
  484. {
  485. if(__size != rhs.__size) return true;
  486. for(size_type __c = 0; __c != __size; ++__c)
  487. if(__base[__c] != rhs.__base[__c])
  488. return true;
  489. return false;
  490. }
  491. bool operator<(const vector& rhs)
  492. {
  493. return std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), rhs.end());
  494. }
  495. bool operator<=(const vector& rhs)
  496. {
  497. return !(std::lexicographical_compare(rhs.begin(), rhs.end(), this->begin(), this->end()));
  498. }
  499. bool operator>(const vector& rhs)
  500. {
  501. return std::lexicographical_compare(rhs.begin(), rhs.end(), this->begin(), this->end());
  502. }
  503. bool operator>=(const vector& rhs)
  504. {
  505. return !(std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), rhs.end()));
  506. }
  507.  
  508. private:
  509. value_type* __base;
  510. size_type __size;
  511. size_type __capacity;
  512. };
  513.  
  514. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement