Advertisement
loalkota

Untitled

Jun 28th, 2021
1,579
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <vector>
  4.  
  5. template <typename T>
  6. class vector_t{
  7. private:
  8.  
  9.   void set_capacity_power_of_two(int x){
  10.     if(x == 0){
  11.       my_capacity = 0;
  12.       return;
  13.     }
  14.  
  15.     int y = 0;
  16.  
  17.     while (std::pow(2, y) < x){
  18.       y++;
  19.     }
  20.  
  21.     my_capacity = std::pow(2, y);
  22.   }
  23.  
  24.   int my_capacity{0};
  25.   T* arr{nullptr};
  26.   int pos{0};
  27.  
  28. public:
  29.   vector_t() = default;
  30.  
  31.   vector_t(size_t n, const T& m = T()){
  32.     if (n != 0){
  33.       set_capacity_power_of_two(n);
  34.  
  35.       arr = new T[my_capacity]();
  36.  
  37.       for(int i = 0; i < n; i++){
  38.         arr[i] = m;
  39.       }
  40.  
  41.       pos = n;
  42.     }
  43.   }
  44.  
  45.   vector_t(const vector_t<T> &other){
  46.     if(other.pos != 0){
  47.       pos = other.pos;
  48.       set_capacity_power_of_two(pos);
  49.  
  50.       arr = new T[my_capacity]();
  51.  
  52.       for(int i = 0; i < pos; i++){
  53.         arr[i] = other.arr[i];
  54.       }
  55.     }
  56.   }
  57.  
  58.   vector_t<T>& operator=(const vector_t<T> &other){
  59.     vector_t<T> temp(other);
  60.     swap(temp);
  61.     return *this;
  62.   }
  63.  
  64.   void swap(vector_t<T> &other){
  65.     std::swap(pos, other.pos);
  66.     std::swap(my_capacity, other.my_capacity);
  67.     std::swap(arr, other.arr);
  68.   }
  69.  
  70.   ~vector_t(){
  71.     clear();
  72.   }
  73.  
  74.   T& operator[](int i) const{
  75.     return arr[i];
  76.   }
  77.  
  78.   T& front() const{
  79.     return arr[0];
  80.   }
  81.  
  82.   T& back() const{
  83.     return arr[pos-1];
  84.   }
  85.  
  86.   bool empty() const{
  87.     if(pos == 0){
  88.       return true;
  89.     }else{
  90.       return false;
  91.     }
  92.   }
  93.  
  94.   int size() const{
  95.     return pos;
  96.   }
  97.  
  98.   void reserve(int new_cap){
  99.     if(my_capacity < new_cap){
  100.       set_capacity_power_of_two(new_cap);
  101.  
  102.       T* new_arr = new T[my_capacity]();
  103.  
  104.       for(int i = 0; i < pos; i++){
  105.         new_arr[i] = arr[i];
  106.       }
  107.  
  108.       delete[] arr;
  109.       arr = new_arr;
  110.     }
  111.   }
  112.  
  113.   T* data() const{
  114.     return arr;
  115.   }
  116.  
  117.   int capacity() const{
  118.     return my_capacity;
  119.   }
  120.  
  121.   void shrink_to_fit(){
  122.     int prev_capacity = my_capacity;
  123.  
  124.     set_capacity_power_of_two(pos);
  125.  
  126.     if(my_capacity == 0){
  127.       pos = 0;
  128.       delete[] arr;
  129.       arr = nullptr;
  130.     }
  131.  
  132.     if(prev_capacity < my_capacity){
  133.       T* new_arr = new T[my_capacity]();
  134.  
  135.       for(int i = 0; i < pos; i++){
  136.         new_arr[i] = arr[i];
  137.       }
  138.  
  139.       delete[] arr;
  140.       arr = new_arr;
  141.     }
  142.   }
  143.  
  144.   void clear(){
  145.     my_capacity = 0;
  146.     pos = 0;
  147.  
  148.     delete[] arr;
  149.     arr = nullptr;
  150.   }
  151.  
  152.   void insert(size_t first, const T& m){
  153.     insert(first, 1, m);
  154.   }
  155.  
  156.   void insert(size_t first, size_t n, const T& m){
  157.     if(n != 0){
  158.       reserve(pos + n);
  159.  
  160.       for(int i = pos + n - 1; i >= first + n; i--){
  161.         arr[i] = arr[i-n];
  162.       }
  163.  
  164.       for(int i = first; i < first + n; i++){
  165.         arr[i] = m;
  166.       }
  167.  
  168.       pos += n;
  169.     }
  170.   }
  171.  
  172.   void erase(size_t first){
  173.     erase(first, first + 1);
  174.   }
  175.  
  176.  
  177.   void erase(size_t first, size_t second){
  178.     int n = second - first;
  179.     pos -= n;
  180.  
  181.     for(int i = first; i < pos; i++){
  182.       arr[i] = arr[i + n];
  183.     }
  184.  
  185.   }
  186.  
  187.   void push_back(const T& m){
  188.     insert(pos, m);
  189.   }
  190.  
  191.   void pop_back(){
  192.     erase(pos - 1);
  193.   }
  194.  
  195.   void resize(size_t new_size, const T&val = T()){
  196.     if(pos < new_size){
  197.       reserve(new_size);
  198.  
  199.       for(int i = pos; i < new_size; i++){
  200.         arr[i] = val;
  201.       }
  202.  
  203.       pos = new_size;
  204.     }else{
  205.       erase(new_size, pos);
  206.     }
  207.   }
  208.  
  209.   friend bool operator==(const vector_t<T> &self, const vector_t<T> &other){
  210.     if(self.pos != other.pos){
  211.       return false;
  212.     }else{
  213.       for(int i = 0; i < self.pos; i++){
  214.         if(self[i] != other[i]){
  215.           return false;
  216.         }
  217.       }
  218.  
  219.       return true;
  220.     }
  221.   }
  222.  
  223.   friend bool operator!=(const vector_t<T> &self, const vector_t<T> &other){
  224.     return !(self == other);
  225.   }
  226.  
  227.   friend bool operator>(const vector_t<T> &self, const vector_t<T> &other){
  228.     for(int i = 0; i < std::min(self.pos, other.pos); i++){
  229.       if(self[i] > other[i]){
  230.         return true;
  231.       }
  232.       if(self[i] < other[i]){
  233.         return false;
  234.       }
  235.     }
  236.  
  237.     if(self.pos > other.pos){
  238.       return true;
  239.     }
  240.  
  241.     if(self.pos < other.pos){
  242.       return false;
  243.     }
  244.  
  245.     return false;
  246.   }
  247.  
  248.   friend bool operator<(const vector_t<T> &self, const vector_t<T> &other){
  249.     return !(self > other) && !(self == other);
  250.   }
  251.  
  252.   friend bool operator>=(const vector_t<T> &self, const vector_t<T> &other){
  253.     return !(self < other);
  254.   }
  255.  
  256.   friend bool operator<=(const vector_t<T> &self, const vector_t<T> &other){
  257.     return !(self > other);
  258.   }
  259. };
  260.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement