zoukankan      html  css  js  c++  java
  • 写手vector

    #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;
    		}
    };
    

      

  • 相关阅读:
    洛谷——P1970 花匠
    洛谷—— P1969 积木大赛
    洛谷——P1966 火柴排队
    洛谷——P1965 转圈游戏
    python练习-跳出多层循环和购物车
    WinCE设置多国语言支持
    java开发环境搭建
    MCC(移动国家码)和 MNC(移动网络码)
    技术团队新官上任之基层篇
    技术团队新官上任之中层篇
  • 原文地址:https://www.cnblogs.com/Stump/p/8109954.html
Copyright © 2011-2022 走看看