Advertisement
Iwanicki

vector v3_pointers

May 14th, 2013
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.30 KB | None | 0 0
  1. #ifndef MYTEMPLATE_VECTOR
  2. #define MYTEMPLATE_VECTOR
  3.  
  4. #include <stdexcept>
  5. #include "vector_iterator.h"
  6.  
  7. namespace mytemplate
  8. {
  9.     template <class T>
  10.     class vector
  11.     {
  12.     private:
  13.         T** array;
  14.         size_t  m_size;
  15.         size_t  m_capacity;
  16.  
  17.         // oblicza następną potęgę 2 nie mniejszą niż 'number'(może być równa)
  18.         size_t nextGreatestPower( size_t number )
  19.         {
  20.             size_t next_power = number-1;
  21.             next_power |= next_power >> 1;
  22.             next_power |= next_power >> 2;
  23.             next_power |= next_power >> 4;
  24.             next_power |= next_power >> 8;
  25.             next_power |= next_power >> 16;
  26.             ++next_power;
  27.  
  28.             return next_power;
  29.         }
  30.  
  31.         void copyArray( T** dst, T* const * src, size_t n )
  32.         {
  33.             for( size_t i = 0; i < n; ++i )
  34.                 dst[i] = src[i];
  35.         }
  36.  
  37.     public:
  38.         vector() : array(nullptr), m_size(0), m_capacity(0) {}
  39.         vector( const vector<T>& vec )
  40.         {
  41.             array = nullptr;
  42.             *this = vec;
  43.         }
  44.         vector( size_t n, const T& val = T() )
  45.         {
  46.             m_capacity = nextGreatestPower( n+1 );
  47.             m_size = n;
  48.             array = new T*[m_capacity];
  49.             for( size_t i = 0; i < n; ++i )
  50.                 array[i] = new T(val);
  51.         }
  52.         ~vector()
  53.         {
  54.             clear();
  55.             delete []array;
  56.         }
  57.  
  58.         typedef vector_iterator<T, vector> iterator;
  59.         typedef vector_const_iterator<T, vector> const_iterator;
  60.  
  61.         void push_back( const T& value )
  62.         {
  63.             if( m_capacity == 0 )
  64.             {
  65.                 array = new T*[2];
  66.                 m_capacity = 2;
  67.             }
  68.             else if( m_size >= m_capacity )
  69.                 reserve( nextGreatestPower( m_capacity + 1 ) );
  70.             array[m_size] = new T(value);
  71.             ++m_size;
  72.         }
  73.  
  74.         void pop_back()
  75.         {
  76.             --m_size;
  77.             delete array[m_size];
  78.         }
  79.  
  80.         void insert( size_t position, const T& value )
  81.         {
  82.             if( m_size == 0 && position == 0 )
  83.             {
  84.                 push_back( value );
  85.                 return;
  86.             }
  87.             else if( position == m_size && m_size == m_capacity )
  88.             {
  89.                 reserve( nextGreatestPower( m_capacity + 1 ) );
  90.             }
  91.             else if( position > m_size )
  92.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  93.  
  94.             for( size_t i = m_size; ; --i )
  95.             {
  96.                 if( i == position )
  97.                 {
  98.                     array[i] = new T(value);
  99.                     break;
  100.                 }
  101.                 else
  102.                     array[i] = array[i-1];
  103.             }
  104.             ++m_size;
  105.         }
  106.  
  107.         void erase( size_t position )
  108.         {
  109.             if( position >= m_size )
  110.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  111.            
  112.             delete array[position];
  113.             for( size_t i = position; i < m_size - 1; ++i )
  114.                 array[i] = array[i+1];
  115.  
  116.             --m_size;
  117.         }
  118.  
  119.         void clear()
  120.         {
  121.             for( size_t i = 0; i < m_size; ++i )
  122.                 delete array[i];
  123.             m_size = 0;
  124.         }
  125.  
  126.         void reserve( size_t n )
  127.         {
  128.             if( n <= m_capacity )
  129.                 return;
  130.             T** tmp = array;
  131.             m_capacity = nextGreatestPower( n );
  132.             array = new T*[ m_capacity ];
  133.             copyArray( array, tmp, m_size );
  134.             delete []tmp;
  135.         }
  136.  
  137.         size_t size() const
  138.         {
  139.             return m_size;
  140.         }
  141.  
  142.         size_t capacity() const
  143.         {
  144.             return m_capacity;
  145.         }
  146.  
  147.         T& front()
  148.         {
  149.             return *array[0];
  150.         }
  151.  
  152.         const T& front() const
  153.         {
  154.             return *array[0];
  155.         }
  156.  
  157.         T& back()
  158.         {
  159.             return *array[m_size-1];
  160.         }
  161.  
  162.         const T& back() const
  163.         {
  164.             return *array[m_size-1];
  165.         }
  166.  
  167.         iterator begin()
  168.         {
  169.             return iterator( &array[0] );
  170.         }
  171.  
  172.         const_iterator begin() const
  173.         {
  174.             return const_iterator( &array[0] );
  175.         }
  176.  
  177.         iterator end()
  178.         {
  179.             return iterator( &array[m_size] );
  180.         }
  181.  
  182.         const_iterator end() const
  183.         {
  184.             return const_iterator( &array[m_size] );
  185.         }
  186.  
  187.         T& operator[]( size_t index )
  188.         {
  189.             if( index >= m_size )
  190.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  191.             return *array[index];
  192.         }
  193.         const T& operator[]( size_t index ) const
  194.         {
  195.             if( index >= m_size )
  196.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  197.             return *array[index];
  198.         }
  199.  
  200.         void swap( vector<T>& vec )
  201.         {
  202.             std::swap( array, vec.array );
  203.             std::swap( m_size, vec.m_size );
  204.             std::swap( m_capacity, vec.m_capacity );
  205.         }
  206.  
  207.         vector<T>& operator=( const vector<T> &vec )
  208.         {
  209.             if( this == &vec )
  210.                 return *this;
  211.             m_size = vec.size();
  212.             m_capacity = vec.capacity();
  213.             clear();
  214.             T* tmp = array;
  215.             if( vec.capacity() != 0 )
  216.             {
  217.                 array = new T[ vec.capacity() ];
  218.                 copyArray( array, vec.array, m_size );
  219.             }
  220.             else
  221.                 array = nullptr;
  222.             delete []tmp;
  223.             return *this; // umożliwia łańcuchowe przypisywanie np: vec1 = vec2 = vec3 = vec4;
  224.         }
  225.     };
  226. }
  227.  
  228. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement