Advertisement
snake5

the life-saving data structure: sorted container

Jul 8th, 2012
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. template< typename T >
  2. struct Compare
  3. {
  4.     int operator () ( const T& a, const T& b ) const
  5.     {
  6.         return a == b ? 0 : ( a < b ? -1 : 1 );
  7.     }
  8. };
  9.  
  10. template< typename T, class P = Compare< T >, class C = TArray< T > >
  11. struct TSorted
  12. {
  13.     TSorted(){}
  14.  
  15.     void Add( const T& val )
  16.     {
  17.         size_t off = FindNext( val );
  18.         cont.Insert( off, val );
  19.     }
  20.     INLINE bool Remove( const T& val )
  21.     {
  22.         size_t whr = Find( val );
  23.         if( whr >= cont.Size() )
  24.             return FALSE;
  25.         Erase( whr );
  26.         return TRUE;
  27.     }
  28.    
  29.     INLINE void Erase( size_t at ) { cont.Erase( at, at ); }
  30.     INLINE void Erase( size_t from, size_t to ) { cont.Erase( from, to ); }
  31.     INLINE void Clear() { cont.Clear(); }
  32.  
  33.     size_t FindNext( const T& val ) const
  34.     {
  35.         int32_t min = 0, max = cont.Size() - 1;
  36.         while( min <= max )
  37.         {
  38.             int32_t mid = ( min + max ) / 2;
  39.             if( pred( val, cont[ mid ] ) < 0 )
  40.                 max = mid - 1;
  41.             else
  42.                 min = mid + 1;
  43.         }
  44.         return MAX( min, max );
  45.     }
  46.     size_t Find( const T& val ) const
  47.     {
  48.         int32_t min = 0, max = cont.Size() - 1;
  49.         while( min <= max )
  50.         {
  51.             int32_t mid = ( min + max ) / 2;
  52.             int32_t chk = pred( val, cont[ mid ] );
  53.             if( chk == 0 )
  54.                 return mid;
  55.             else if( chk < 0 )
  56.                 max = mid - 1;
  57.             else
  58.                 min = mid + 1;
  59.         }
  60.         return SIZE_MAX;
  61.     }
  62.  
  63.     template< typename Tst >
  64.     size_t Find( Tst& val ) const
  65.     {
  66.         int32_t min = 0, max = cont.Size() - 1;
  67.         while( min <= max )
  68.         {
  69.             int32_t mid = ( min + max ) / 2;
  70.             int32_t chk = val( cont[ mid ] );
  71.             if( chk == 0 )
  72.                 return mid;
  73.             else if( chk < 0 )
  74.                 max = mid - 1;
  75.             else
  76.                 min = mid + 1;
  77.         }
  78.         return SIZE_MAX;
  79.     }
  80.  
  81.     FINLINE T& At( size_t pos ){ return cont.At( pos ); }
  82.     FINLINE const T& At( size_t pos ) const{ return cont.At( pos ); }
  83.     FINLINE T& operator [] ( size_t pos ){ return cont[ pos ]; }
  84.     FINLINE const T& operator [] ( size_t pos ) const{ return cont[ pos ]; }
  85.     FINLINE size_t Size() const{ return cont.Size(); }
  86.  
  87.     P pred;
  88.     C cont;
  89. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement