Guest User

vector fixed 2

a guest
May 3rd, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #ifndef MYTEMPLATE_VECTOR
  2. #define MYTEMPLATE_VECTOR
  3.  
  4. #include <stdexcept>
  5.  
  6. namespace mytemplate
  7. {
  8.     template <class T>
  9.     class vector
  10.     {
  11.     private:
  12.         T* array;
  13.         size_t  m_size;
  14.         size_t  m_capacity;
  15.  
  16.         // oblicza następną potęgę 2 nie mniejszą niż 'number'(może być równa)
  17.         size_t nextGreatestPower( size_t number )
  18.         {
  19.             size_t next_power = number-1;
  20.             next_power |= next_power >> 1;
  21.             next_power |= next_power >> 2;
  22.             next_power |= next_power >> 4;
  23.             next_power |= next_power >> 8;
  24.             next_power |= next_power >> 16;
  25.             ++next_power;
  26.  
  27.             return next_power;
  28.         }
  29.  
  30.         void copyArray( T* dst, const T* src, size_t n )
  31.         {
  32.             for( size_t i = 0; i < n; ++i )
  33.                 dst[i] = src[i];
  34.         }
  35.  
  36.     public:
  37.         vector() : array(nullptr), m_size(0), m_capacity(0) {}
  38.         vector( const vector<T>& vec )
  39.         {
  40.             *this = vec;
  41.         }
  42.  
  43.         vector( size_t n, const T& val = T() )
  44.         {
  45.             m_capacity = nextGreatestPower( n+1 );
  46.             m_size = n;
  47.             array = new T[m_capacity];
  48.             for( size_t i = 0; i < n; ++i )
  49.                 array[i] = val;
  50.         }
  51.         ~vector()
  52.         {
  53.             if( array != nullptr )
  54.                 delete []array;
  55.         }
  56.         void push_back( const T& value )
  57.         {
  58.             if( m_capacity == 0 )
  59.             {
  60.                 array = new T[2];
  61.                 m_capacity = 2;
  62.             }
  63.             else if( m_size >= m_capacity )
  64.                 reserve( nextGreatestPower( m_capacity + 1 ) );
  65.             array[m_size] = value;
  66.             ++m_size;
  67.         }
  68.  
  69.         void pop_back()
  70.         {
  71.             --m_size;
  72.         }
  73.  
  74.         void insert( size_t position, const T& value )
  75.         {
  76.             if( m_size == 0 && position == 0 )
  77.             {
  78.                 push_back( value );
  79.                 return;
  80.             }
  81.             else if( position == m_size && m_size == m_capacity )
  82.             {
  83.                 reserve( nextGreatestPower( m_capacity + 1 ) );
  84.             }
  85.             else if( position >= m_size )
  86.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  87.  
  88.             for( size_t i = m_size; ; --i )
  89.             {
  90.                 if( i == position )
  91.                 {
  92.                     array[i] = value;
  93.                     break;
  94.                 }
  95.                 else
  96.                     array[i] = array[i-1];
  97.             }
  98.             ++m_size;
  99.         }
  100.  
  101.         void erase( size_t position )
  102.         {
  103.             if( position >= m_size )
  104.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  105.             for( size_t i = position; i < m_size - 1; ++i )
  106.                 array[i] = array[i+1];
  107.  
  108.             --m_size;
  109.         }
  110.  
  111.         size_t size() const
  112.         {
  113.             return m_size;
  114.         }
  115.  
  116.         size_t capacity() const
  117.         {
  118.             return m_capacity;
  119.         }
  120.  
  121.         void reserve( size_t n )
  122.         {
  123.             if( n <= m_capacity )
  124.                 return;
  125.             T* tmp = array;
  126.             m_capacity = nextGreatestPower( n );
  127.             array = new T[ m_capacity ];
  128.             copyArray( array, tmp, m_size );
  129.             if( tmp != nullptr )
  130.                 delete tmp;
  131.         }
  132.  
  133.         T& operator[]( size_t index )
  134.         {
  135.             if( index >= m_size )
  136.                 throw std::out_of_range( "Vector Subscript Out of Range" );
  137.             return array[index];
  138.         }
  139.  
  140.         vector<T>& operator=( const vector<T> &vec )
  141.         {
  142.             m_size = vec.size();
  143.             m_capacity = vec.capacity();
  144.             if( vec.capacity() != 0 )
  145.             {
  146.                 array = new T[ vec.capacity() ];
  147.                 copyArray( array, vec.array, m_size );
  148.             }
  149.             else
  150.                 array = nullptr;
  151.  
  152.             return *this; // umożliwia łańcuchowe przypisywanie np: vec1 = vec2 = vec3 = vec4;
  153.         }
  154.     };
  155. }
  156.  
  157. #endif
Advertisement
Add Comment
Please, Sign In to add comment