Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.57 KB | None | 0 0
  1. #ifndef VECTOR_H
  2. #define VECTOR_H
  3.  
  4. #include <iostream>
  5. #include <stdexcept>   
  6. #include <initializer_list>
  7.  
  8. class Vector {
  9.  
  10.  public:
  11.     class ConstIterator;
  12.     class Iterator;
  13.  
  14.     using value_type = double;
  15.     using size_type = std::size_t;
  16.     using difference_type = std::ptrdiff_t;
  17.     using reference = value_type&;
  18.     using const_reference = const value_type&;
  19.     using pointer = value_type*;
  20.     using const_pointer = const value_type*;
  21.     using iterator = Vector::Iterator;
  22.     using const_iterator = Vector::ConstIterator;
  23.  
  24.  private:
  25.     size_type sz; //Anzahl an der Elementen in der Vector
  26.     size_type max_sz; // Maxiamale Anzahl an Elemnten
  27.     pointer values; // Zeigt auf den ersten Element in der Vector in  unserem Fall(double)
  28.     static constexpr size_type min_sz {5}; // Mindestens grosse fur sz;
  29.  
  30.  public:
  31.  
  32.     class Iterator{
  33.         public:
  34.             using value_type = Vector::value_type;
  35.             using reference = Vector::reference;
  36.             using pointer = Vector::pointer;
  37.             using difference_type = Vector::difference_type;
  38.             using iterator_category = std::forward_iterator_tag;
  39.  
  40.         private:
  41.             pointer ptr; // Zeigt auf ein Element im Vector (Instanzvariablen)
  42.  
  43.  
  44.         public:
  45.             Iterator() : ptr{nullptr} {} // Liefert einen Iterator auf nullptr
  46.             Iterator (pointer ptr) : ptr{ptr} {}
  47.  
  48.             //Methoden
  49.             reference operator*() const{return *ptr;}
  50.             pointer operator->() const {return this->ptr;}
  51.             friend bool operator==(const iterator& lop, const iterator& rop)
  52.              {
  53.                 return lop.ptr == rop.ptr;
  54.              }
  55.             friend bool operator!=(const iterator&lop, const iterator&rop)
  56.              {
  57.                 return lop.ptr != rop.ptr;
  58.              }
  59.             iterator& operator++()
  60.             {
  61.                 ++ptr;
  62.                 return *this;
  63.             }
  64.             iterator operator++(int)
  65.             {
  66.                 auto temp = *this;
  67.                 ++(*this);
  68.                 return temp;
  69.             }
  70.             operator const_iterator() const {return ConstIterator{ptr};}
  71.             friend difference_type operator-(const iterator& lop, const iterator& rop){
  72.                 return lop.ptr - rop.ptr;
  73.             }
  74.  
  75.  
  76.     };
  77.     class ConstIterator {
  78.         public:
  79.             using value_type = Vector::value_type;
  80.             using reference = Vector::const_reference;
  81.             using pointer = Vector::const_pointer;
  82.             using difference_type = Vector::difference_type;
  83.             using iterator_category = std::forward_iterator_tag;
  84.  
  85.         private:
  86.             pointer ptr;           
  87.         public:
  88.             ConstIterator() : ptr{nullptr} {}
  89.             ConstIterator(pointer ptr) : ptr{ptr}{}
  90.  
  91.             const_reference operator*() const { return *ptr;}
  92.             const_pointer operator-> () const {  return this->ptr;}
  93.             friend bool operator==(const const_iterator&lop, const const_iterator&rop)
  94.             {
  95.                 return lop.ptr == rop.ptr;
  96.             }
  97.             friend bool operator!=(const const_iterator&lop, const const_iterator&rop)
  98.             {
  99.                 return lop.ptr != rop.ptr;
  100.             }
  101.             const_iterator& operator++()
  102.             {
  103.                 ++ptr;
  104.                 return *this;
  105.             }
  106.             const_iterator operator++(int)
  107.             {
  108.                 auto temp = *this;
  109.                 ++(*this);
  110.                 return temp;
  111.             }
  112.  
  113.             friend difference_type operator-(const const_iterator& lop, const const_iterator& rop){
  114.                 return lop.ptr - rop.ptr;
  115.             }
  116.     };
  117.  
  118.      //Konstruktor ohne Argumenten (leeren Vector)
  119.     Vector() : sz{0}, max_sz{min_sz}, values{ new value_type[max_sz]} {}
  120.        
  121.    
  122.   //Konstruktor mit einem Arg. //
  123.     Vector(size_type n) : sz{0}
  124.     {
  125.         if(n < min_sz) n = min_sz;
  126.         max_sz = n;
  127.         values = new value_type[max_sz];
  128.     }
  129.   //Vector mit sprezifizirtem Inhalt
  130.     Vector(std::initializer_list<value_type>liste) :  Vector (liste.size())
  131.     {
  132.         for(const auto &i : liste)
  133.             values[sz++] = i;
  134.     /*                          
  135.     for(size_t i=0;i<liste.size();i++)
  136.       values[sz++]=liste[i]; */
  137.  
  138.     }
  139.   //Copy Konstruktor  
  140.     Vector (const Vector &source ) : Vector (source.size())
  141.     {
  142.  
  143.         sz = source.sz;
  144.         for(size_t i{0}; i<sz; i++)
  145.             values[i] = source.values[i];
  146.     }
  147.   //Destruktor
  148.     ~Vector()
  149.     {
  150.         delete [] values;
  151.     }
  152.  
  153.     iterator begin() { return Iterator(values);}
  154.     iterator end() { return Iterator(values+sz);}
  155.  
  156.     const_iterator begin() const {return ConstIterator(values);}
  157.     const_iterator end() const {return ConstIterator(values+sz);}
  158.  
  159.     iterator erase (const_iterator pos) {
  160.       auto diff = pos-begin();
  161.       if(diff<0 || static_cast<size_type>(diff)>sz)
  162.         throw std::runtime_error("Iterator out of bounds");
  163.       size_type current{static_cast<size_type>(diff)};
  164.  
  165.       for(size_type i{current}; i<sz-1; ++i)
  166.         values[i]=values[i+1];
  167.       --sz;
  168.       return iterator{values+current};
  169.     }
  170.    
  171.      iterator insert (const_iterator pos, const_reference val) {
  172.       auto diff = pos-begin();
  173.       if(diff<0 || static_cast<size_type>(diff)>sz)
  174.         throw std::runtime_error("Iterator out of bounds");
  175.       size_type current{static_cast<size_type>(diff)};
  176.       if(sz>=max_sz)
  177.         reserve(max_sz*2);
  178.       for(size_type i{sz}; i-- > current;)
  179.         values[i+1]=values[i];
  180.       values[current]=val;
  181.       ++sz;
  182.       return iterator{values+current};
  183.     }
  184.  
  185.  
  186.   //Returniert Anzahl der gespeicherten Elementen
  187.     size_type size() const
  188.     {
  189.         return sz;
  190.     }
  191.   //Retuniert true falls der Vector leer ist
  192.     bool empty() const
  193.     {
  194.         return !sz;
  195.     }
  196.   //Loest alle Elemente aus dem Vektor
  197.     void clear()
  198.     {
  199.         sz = 0;
  200.     }
  201.   //Kapazitaet auf n vergroesen falls noetig
  202.     void reserve(size_type n)
  203.     {
  204.         if(n <= max_sz) return;
  205.         if(empty()) return;
  206.         pointer temp = new value_type [n];
  207.         for(size_type i{0}; i<sz; i++)
  208.             temp[i] = values[i];
  209.         delete [] values;
  210.         values = temp;
  211.         max_sz = n;
  212.     }
  213.   //Kapazitaet wird auf Anzahl der Elemente reduziert // fazon ima ih 9 i njemu treba 5 i 5 i napise
  214.     void shrink_to_fit()
  215.     {
  216.  
  217.         pointer temp = new value_type [sz];
  218.         for(size_type i{0}; i<sz; i++)
  219.             temp[i] = values [i];
  220.         delete [] values;
  221.         max_sz = sz;
  222.         values = temp;
  223.     }
  224.     //Fuegt eine Kopie von x am Ende des Vectors hinzu npr na values[9] = 5 na devetoj poziciji ce stavaviti 5 na kraj naravno
  225.     void push_back(value_type x)
  226.     {
  227.           if(sz >= max_sz) reserve(sz*2);
  228.         values[sz++] = x;
  229.     }
  230.     //Entfert das letze Element im Vector
  231.     void pop_back()
  232.     {
  233.         if(empty()) throw std::runtime_error(" Der Vector ist leer : Error");
  234.         --sz;
  235.  
  236.     }
  237.     //Kopiezuweisungsoperator(operator=)- Das this Objekt übernimmt die Werte vom Parameter
  238.     Vector operator=(Vector obj)
  239.     {
  240. // 1. ptr freigeben
  241. // 2. neuen Speicher anfordern
  242. // 3. Variablen kopieren
  243. //  Elemente rueberkopieren
  244.              std::swap(sz, obj.sz);
  245.             std::swap(max_sz,obj.max_sz);
  246.             std::swap(values, obj.values);
  247.  
  248.       return *this;
  249.     }
  250.     //Retourniert das Element an der gegebenen Position (index),out of Bounds auserhalb der Grenzen
  251.     reference operator [](size_type index)
  252.     {
  253.        if(index < 0 || index >= max_sz)
  254.         throw std::runtime_error ("Out of Bounds");
  255.      return values[index];
  256.  
  257.     }
  258.     //Retourniert das Element an der gegebenen Position (index),out of Bounds auserhalb der Grenzen
  259.     const_reference operator[](size_type index) const // index manje od sajza znaci da postoji
  260.     {
  261.        if(index < 0 || index >= max_sz)
  262.         throw std::runtime_error ("Out of Bounds");
  263.       return values[index];
  264.     }
  265.     // Retourniet aktuelle kapazietaet des Vectors
  266.     size_type capacity() const
  267.     {
  268.       return max_sz;
  269.     }
  270.  
  271.  
  272.  
  273.    friend  std::ostream& operator<<(std::ostream& os, const Vector& vec)
  274.   {
  275.       os << "[";
  276.       for(size_type i{0}; i<vec.sz; i++)
  277.       {
  278.         if(i) os << ", ";
  279.       os << vec.values[i];
  280.       }
  281.       os << "]";
  282.       return os;
  283.   }
  284.  
  285. };
  286. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement