码迷,mamicode.com
首页 > 其他好文 > 详细

写手vector

时间:2017-12-25 17:02:00      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:div   copy   cte   pen   private   ++   def   sharp   []   

#define DEFAULT_CAPACITY 3

typedef int Rank;

class Fib {
	private:
		int f, g;
	public:
		Fib( int n ) { f = 1; g = 0; while( g < n ) next(); }
		inline int get() { return g; }
		inline int next() { g += f; f = g - f; return g; }
		inline int prev() { f = g - f; g -= f; return g; }
};

template <typename T> class Vector {
	protected:
		Rank _size; int _capacity; T* _elem;
		inline void copyfrom( T const *A, Rank l, Rank r ) {
			_elem = new T[_capacity = ( r - l ) << 1]; _size = 0;
			while( l < r )
				_elem[_size++] = A[l++];
		}
		inline void expand() {
			if( _size < _capacity )
				return;
			if( _capacity < DEFAULT_CAPACITY )
				_capacity = DEFAULT_CAPACITY;
			T* oldElem = _elem;
			_elem = new T[_capacity <<= 1];
			for( register int i = 0; i <= _size; ++i )
				_elem[i] = oldElem[i];
			delete [] oldElem;
		}
		inline void shrink() {
			if( _capacity < DEFAULT_CAPACITY << 1 )
				return;
			if( _size << 2 > _capacity )
				return;
			T* oldElem = _elem;
			_elem = new T[_capacity >>= 1];
			for( register int i = 0; i <= _size; ++i )
				_elem[i] = oldElem[i];
			delete [] oldElem;
		}
		inline Rank fibsearch( T *A, T const &e, Rank l, Rank r ) {
			Fib fib( r - l );
			while( l < r ) {
				while( r - l < fib.get() )
					fib.prev();
				Rank mid = l + fib.get() - 1;
				if( e < A[mid] )
					r = mid;
				else
					if( A[mid] < e )
						l = mid + 1;
					else
						return mid;
			}
			return -1;
		}
		inline Rank find( T const &e, Rank l, Rank r ) {
			while( ( l < r-- ) && e != _elem[r] );
			return r;
		}
	public:
		Vector( int c = DEFAULT_CAPACITY, int s = 0, T v = 0 ) {
			_elem = new T[_capacity = c]; for ( _size = 0; _size < s; _elem[_size++] = v );
		}
		Vector( T const* A, Rank n ) { copyFrom ( A, 0, n ); }
		Vector ( T const* A, Rank lo, Rank hi ) { copyFrom ( A, lo, hi ); }
		Vector ( Vector<T> const& V ) { copyFrom ( V._elem, 0, V._size ); }
		Vector ( Vector<T> const& V, Rank lo, Rank hi ) { copyFrom ( V._elem, lo, hi ); }
		~Vector() { delete [] _elem; }
		Rank size() const { return _size; }
		bool empty() const { return !_size; }
		Rank find ( T const& e ) const { return find ( e, 0, _size ); }
		Rank find ( T const& e, Rank lo, Rank hi ) const;
		Rank search ( T const& e ) const { return ( 0 >= _size ) ? -1 : search ( e, 0, _size ); }
		Rank search ( T const& e, Rank lo, Rank hi ) const;
		T& operator [] ( Rank r ) const;
		Vector<T> & operator = ( Vector<T> const& );
		inline T remove( Rank r ) { T e = _elem[r]; remove( r, r + 1 ); return e; }
		inline Rank insert( Rank r, T const &e ) {
			expand();
			for( register int i = _size; r < i; --i )
				_elem[i] = _elem[i - 1];
			_elem[r] = e, ++_size;
			return r;
		}
};

  

写手vector

标签:div   copy   cte   pen   private   ++   def   sharp   []   

原文地址:http://www.cnblogs.com/Stump/p/8109954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!