Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.54 KB | None | 0 0
  1. template <typename T>
  2. class Vector
  3. {
  4. public:
  5. using Iterator = T*;
  6. using size_type = unsigned int;
  7.  
  8. Vector();
  9. Vector(size_type n, const T& initial);
  10. Vector(const Vector<T>& v);
  11. Vector(Vector<T>&& v);
  12. Vector<T>& operator= (const Vector<T>& v);
  13. Vector<T>& operator= (Vector<T>&& v);
  14. ~Vector();
  15.  
  16. size_type size() const;
  17. size_type capacity() const;
  18. bool empty() const;
  19. void reserve(size_type n);
  20.  
  21. Iterator begin();
  22. Iterator end();
  23.  
  24. T& operator[] (size_type n);
  25. T& at(size_type n);
  26.  
  27. void push_back(const T& value);
  28. void pop_back();
  29. template<typename... Args>
  30. void emplace_back(Args&&... args);
  31. Iterator insert(Iterator position, const T& value);
  32. Iterator erase(Iterator position);
  33. void clear();
  34.  
  35. friend void swap(Vector<T>& first, Vector<T>& second);
  36. private:
  37. size_type m_size;
  38. size_type m_capacity;
  39. char* m_buffer;
  40. };
  41.  
  42. template <typename T>
  43. Vector<T>::Vector()
  44. : m_size(0)
  45. , m_capacity(1)
  46. , m_buffer(new char[sizeof(T) * m_capacity])
  47. {
  48.  
  49. }
  50.  
  51. template <typename T>
  52. Vector<T>::Vector(size_type n, const T& initial)
  53. : m_size(n)
  54. , m_capacity(2 * n)
  55. , m_buffer(new char[sizeof(T) * m_capacity])
  56. {
  57. for (size_type i = 0; i < m_size; i++)
  58. {
  59. new (m_buffer + sizeof(T) * i) T(initial);
  60. }
  61. }
  62.  
  63. template <typename T>
  64. Vector<T>::Vector(const Vector<T> &v)
  65. : m_size(v.m_size)
  66. , m_capacity(v.m_capacity)
  67. , m_buffer(new char [sizeof(T) * m_capacity])
  68. {
  69. for (auto i = 0; i < m_size; i++)
  70. {
  71. new (m_buffer + sifeof(T) * i) T(v[i]);
  72. }
  73. }
  74.  
  75. template <typename T>
  76. Vector<T>::Vector(Vector<T>&& v)
  77. : m_size(v.m_size)
  78. , m_capacity(v.m_capacity)
  79. , m_buffer(v.m_buffer)
  80. {
  81. v.m_buffer = nullptr;
  82. }
  83.  
  84. template <typename T>
  85. Vector<T>& Vector<T>::operator=(Vector<T> v)
  86. {
  87. swap(*this, v);
  88. return *this;
  89. }
  90.  
  91. template <typename T>
  92. Vector<T>& Vector<T>::operator=(Vector<T>&& v)
  93. {
  94. if (this != &v)
  95. {
  96. delete[] m_buffer;
  97. m_size = v.m_size;
  98. m_capacity = v.m_capacity;
  99. m_buffer = v.m_buffer;
  100. v.m_buffer = nullptr;
  101. }
  102. return *this;
  103. }
  104.  
  105. template <typename T>
  106. Vector<T>::~Vector()
  107. {
  108. delete[] m_buffer;
  109. }
  110.  
  111. template <typename T>
  112. typename Vector<T>::size_type Vector<T>::size() const
  113. {
  114. return m_size;
  115. }
  116.  
  117. template <typename T>
  118. typename Vector<T>::size_type Vector<T>::capacity() const
  119. {
  120. return m_capacity;
  121. }
  122.  
  123. template <typename T>
  124. bool Vector<T>::empty() const
  125. {
  126. return m_size == 0;
  127. }
  128.  
  129. template <typename T>
  130. void Vector<T>::reserve(size_type n)
  131. {
  132. if (n <= m_capacity)
  133. {
  134. return;
  135. }
  136. m_capacity = n;
  137. char* new_buffer = new char[sizeof(T) * m_capacity];
  138. for (size_type i = 0; i < m_size; i++)
  139. {
  140. new (new_buffer + sizeof(T) * i) T((*this)[i]);
  141. }
  142. delete[] m_buffer;
  143. m_buffer = new_buffer;
  144. }
  145.  
  146. template <typename T>
  147. typename Vector<T>::Iterator Vector<T>::begin()
  148. {
  149. return reinterpret_cast<T*>(m_buffer);
  150. }
  151.  
  152. template <typename T>
  153. typename Vector<T>::Iterator Vector<T>::end()
  154. {
  155. return reinterpret_cast<T*>(m_buffer) + m_size;
  156. }
  157.  
  158. template <typename T>
  159. T& Vector<T>::operator[](size_type n)
  160. {
  161. return reinterpret_cast<T*>(m_buffer)[n];
  162. }
  163.  
  164. template <typename T>
  165. T& Vector<T>::at(size_type n)
  166. {
  167. if (n >= m_size)
  168. {
  169. throw std::out_of_range("Out of range");
  170. }
  171. return reinterpret_cast<T*>(m_buffer)[n];
  172. }
  173.  
  174. template <typename T>
  175. void Vector<T>::push_back(const T& value)
  176. {
  177. if (m_size >= m_capacity)
  178. {
  179. reserve(2 * m_size);
  180. }
  181. new (end()) T(value);
  182. ++m_size;
  183. }
  184.  
  185. template <typename T>
  186. void Vector<T>::pop_back()
  187. {
  188. (*this)[m_size - 1]->~T();
  189. --m_size;
  190. }
  191.  
  192. template <typename T>
  193. template <typename... Args>
  194. void Vector<T>::emplace_back(Args&& ...args)
  195. {
  196. if (m_size >= m_capacity)
  197. {
  198. reserve(2 * m_size);
  199. }
  200. new(end()) T(std::forward<Args>(args)...);
  201.  
  202. }
  203.  
  204. template <typename T>
  205. typename Vector<T>::Iterator Vector<T>::insert(Iterator position, const T& value)
  206. {
  207. if (m_size >= m_capacity)
  208. {
  209. reserve(2 * m_capacity);
  210. }
  211. auto current_position = end();
  212. while (current_position != position)
  213. {
  214. *current_position = *(current_position - 1);
  215. --current_position;
  216. }
  217. *current_position = value;
  218.  
  219. ++m_size;
  220. return position;
  221. }
  222.  
  223. template <typename T>
  224. typename Vector<T>::Iterator Vector<T>::erase(Iterator position)
  225. {
  226. position->~T();
  227. auto current_position = position + 1;
  228. while (current_position != end())
  229. {
  230. *(current_position - 1) = *current_position;
  231. ++current_position;
  232. }
  233. --m_size;
  234. return position;
  235. }
  236.  
  237. template <typename T>
  238. void Vector<T>::clear()
  239. {
  240. for (size_type i = 0; i < m_size; i++)
  241. {
  242. (*this)[i]->~T();
  243. }
  244. m_size = 0;
  245. }
  246.  
  247. template <typename T>
  248. void swap(Vector<T>& first, Vector<T>& second)
  249. {
  250. std::swap(first.m_size, second.m_size);
  251. std::swap(first.m_capacity, second.m_capacity);
  252. std::swap(first.m_buffer, second.m_buffer);
  253. }
  254.  
  255. main.cpp
  256.  
  257. #include <iostream>
  258. #include "Vector.h"
  259.  
  260.  
  261. int main()
  262. {
  263. Vector<int> v(10, 5);
  264. v.push_back(4);
  265. v.push_back(7);
  266. v.erase(v.begin() + 11);
  267. v.insert(v.begin() + 2, 13);
  268. for (auto i = 0; i < v.size(); i++)
  269. {
  270. std::cout << v[i] << std::endl;
  271. }
  272. return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement