/**/
template< typename Type, typename Sequence = std::vector< Type > >
class CSortedArray;
/**/
template< typename Type, typename Sequence >
class CSortedArray{
public:
typedef typename Sequence::value_type value_type;
typedef typename Sequence::reference reference;
typedef typename Sequence::const_reference const_reference;
typedef typename Sequence::size_type size_type;
typedef typename Sequence::const_iterator const_iterator;
typedef Sequence container_type;
Sequence pvArray;
private:
typedef typename Sequence::iterator iterator;
typename CSortedArray< Type, Sequence >::iterator
find_position( const value_type& f_Element );
template< typename Iterator >
void copy_from( Iterator f_Begin, Iterator f_End ){ ... }
public:
explicit CSortedArray( const Sequence& f_Array = Sequence() );
~CSortedArray(){};
#if 0 // used by default
CSortedArray( CSortedArray< Type > const& f_SortedArray );
CSortedArray< Type >& operator=( CSortedArray< Type > const& f_SortedArray );
#endif
typename CSortedArray< Type, Sequence >::const_iterator
insert( const typename CSortedArray< Type, Sequence >::value_type&
f_Element );
size_type size() const;
bool empty() const;
/*
const_reference operator[]( size_type ) const{};
*/
const_iterator begin() const;
const_iterator end() const;
};
// Далее реализация общей функции
template< typename Type, typename Sequence >
typename CSortedArray< Type, Sequence >::iterator
CSortedArray< Type, Sequence >::find_position( const value_type& f_Element ) {
typedef typename iterator::difference_type distance;
iterator begin( pvArray.begin() );
iterator end( pvArray.end() );
distance dist( std::distance( begin, end ) );
while( dist > 0 ){
dist >>= 1;
iterator middle( begin );
std::advance( middle, dist );
if( middle == pvArray.end() )
return pvArray.end();
if( f_Element < *middle )
end = middle;
else if( f_Element > *middle )
begin = middle + 1;
else
return middle;
}
return end;
}
// Далее реализация специалезированной функции для указателей на cstring
template<>
CSortedArray< char*, std::vector< char* > >::iterator
CSortedArray< char*, std::vector< char* > >::find_position(
const value_type& f_Element ) \{
typedef iterator::difference_type distance;
int test;
iterator begin( pvArray.begin() );
iterator end( pvArray.end() );
distance dist( std::distance( begin, end ) );
while( dist > 0 ){
dist >>= 1;
iterator middle( begin );
std::advance( middle, dist );
if( middle == pvArray.end() )
return pvArray.end();
test = std::strcmp( f_Element, *middle );
if( test < 0 )
end = middle;
else if( test > 0 )
begin = middle + 1;
else
return middle;
}
return end;
} |