Advertisement
bruh1214

idk

Apr 6th, 2022
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #pragma once
  2.  
  3. #define INIT_CAP 5
  4.  
  5. template<typename TElem>
  6. class Iterator;
  7.  
  8. template<typename TElem>
  9. class VectDinamic {
  10. private:
  11.     int lg;
  12.     int cap;
  13.     TElem* elems;
  14.  
  15.     void ensureCapacity();
  16.  
  17. public:
  18.  
  19.     //constructor
  20.     VectDinamic();
  21.  
  22.     VectDinamic(const VectDinamic& ot);
  23.  
  24.     //destructor
  25.     ~VectDinamic();
  26.  
  27.     /*
  28.     Operator assignment
  29.     */
  30.     VectDinamic& operator=(const VectDinamic& ot);
  31.  
  32.     /*
  33.     Move constructor
  34.     */
  35.     VectDinamic(VectDinamic&& ot);
  36.  
  37.     /*
  38.     Move assignment
  39.     */
  40.     VectDinamic& operator=(VectDinamic&& ot);
  41.  
  42.     void add(const TElem& elem);
  43.  
  44.     int getSize() const noexcept;
  45.    
  46.     TElem& getElem(int pos) const;
  47.    
  48.     void set(int pos, const TElem& elem);
  49.    
  50.     friend class Iterator<TElem>;
  51.     Iterator<TElem> begin();
  52.     Iterator<TElem> end();
  53. };
  54.  
  55. template <typename TElem> VectDinamic<TElem>::VectDinamic() : lg{ 0 }, cap{ INIT_CAP }, elems{ new TElem[INIT_CAP] }{}
  56.  
  57. template <typename TElem> VectDinamic<TElem>::~VectDinamic() {
  58.     delete[] elems;
  59. }
  60.  
  61. template <typename TElem> VectDinamic<TElem>::VectDinamic(const VectDinamic& ot) {
  62.     elems = new TElem[ot.cap];
  63.     for (int i = 0; i < ot.lg; i++) {
  64.         elems[i] = ot.elems[i];
  65.     }
  66.     lg = ot.lg;
  67.     cap = ot.cap;
  68. }
  69.  
  70. template <typename TElem> VectDinamic<TElem>& VectDinamic<TElem>::operator=(const VectDinamic& ot) {
  71.     if (this == &ot) {
  72.         return *this;
  73.     }
  74.     delete[] elems;
  75.     elems = new TElem[ot.cap];
  76.     for (int i = 0; i < ot.lg; i++) {
  77.         elems[i] = ot.elems[i];
  78.     }
  79.     lg = ot.lg;
  80.     cap = ot.cap;
  81.     return *this;
  82. }
  83.  
  84. template<typename TElem> VectDinamic<TElem>::VectDinamic(VectDinamic&& ot) {
  85.     elems = ot.elems;
  86.     lg = ot.lg;
  87.     cap = ot.cap;
  88.  
  89.     ot.elems = nullptr;
  90.     ot.lg = 0;
  91.     ot.cap = 0;
  92. }
  93.  
  94. template<typename TElem> VectDinamic<TElem>& VectDinamic<TElem>::operator=(VectDinamic&& ot) {
  95.     if (this == &ot) {
  96.         return *this;
  97.     }
  98.     delete[] elems;
  99.     elems = ot.elems;
  100.     lg = ot.lg;
  101.     cap = ot.cap;
  102.  
  103.     ot.elems = nullptr;
  104.     ot.lg = 0;
  105.     ot.cap = 0;
  106.  
  107.     return *this;
  108. }
  109.  
  110. template<typename TElem> void VectDinamic<TElem>::ensureCapacity() {
  111.     if (lg >= cap) {
  112.         cap *= 2;
  113.         TElem* new_elems = new TElem[cap];
  114.         for (int i = 0; i < lg; i++) {
  115.             new_elems[i] = elems[i];
  116.         }
  117.         delete[] elems;
  118.         elems = new_elems;
  119.     }
  120. }
  121.  
  122. template<typename TElem> void VectDinamic<TElem>::add(const TElem& el) {
  123.     ensureCapacity();
  124.     elems[lg++] = el;
  125. }
  126.  
  127. template<typename TElem> int VectDinamic<TElem>::getSize() const noexcept {
  128.     return lg;
  129. }
  130.  
  131. template<typename TElem> TElem& VectDinamic<TElem>::getElem(int pos) const {
  132.     return elems[pos];
  133. }
  134.  
  135. template<typename TElem> void VectDinamic<TElem>::set(int pos, const TElem& elem) {
  136.     elems[pos] = elem;
  137. }
  138.  
  139. template<typename TElem> Iterator<TElem> VectDinamic<TElem>::begin(){
  140.     return Iterator<TElem>(*this);
  141. }
  142.  
  143. template<typename TElem> Iterator<TElem> VectDinamic<TElem>::end(){
  144.     return Iterator<TElem>(*this, lg);
  145. }
  146.  
  147. template<typename TElem>
  148. class Iterator {
  149. private:
  150.     int index;
  151.     const VectDinamic<TElem>& vect;
  152.  
  153. public:
  154.     Iterator(const VectDinamic<TElem>& vect) noexcept;
  155.     Iterator(const VectDinamic<TElem>& vect, int index) noexcept;
  156.     bool valid() const;
  157.     void next();
  158.     TElem& element();
  159.     TElem& operator*();
  160.     Iterator& operator++();
  161.     bool operator==(const Iterator& ot) noexcept;
  162.     bool operator!=(const Iterator& ot) noexcept;
  163.  
  164. };
  165.  
  166. template<typename TElem> Iterator<TElem>::Iterator(const VectDinamic<TElem>& vect) noexcept: vect{vect}{}
  167.  
  168. template<typename TElem> Iterator<TElem>::Iterator(const VectDinamic<TElem>& vect, int index) noexcept: vect{vect}, index{index}{}
  169.  
  170. template<typename TElem> bool Iterator<TElem>::valid() const {
  171.     return index < vect.lg;
  172. }
  173.  
  174. template<typename TElem> void Iterator<TElem>::next() {
  175.     index++;
  176. }
  177.  
  178. template<typename TElem> TElem& Iterator<TElem>::element() {
  179.     return vect.elems[index];
  180. }
  181.  
  182. template <typename TElem> TElem& Iterator<TElem>::operator*() {
  183.     return element();
  184. }
  185.  
  186. template<typename TElem> Iterator<TElem>& Iterator<TElem>::operator++() {
  187.     next();
  188.     return (*this);
  189. }
  190.  
  191. template<typename TElem> bool Iterator<TElem>::operator==(const Iterator& ot) noexcept {
  192.     return index == ot.index;
  193. }
  194.  
  195. template<typename TElem> bool Iterator<TElem>::operator!=(const Iterator& ot) noexcept {
  196.     return !(*this == ot);
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement