Listing 2

class STLGlobIterator
    : public std::iterator< std::forward_iterator_tag , 
              const std::string , int >
{
    public:
    STLGlobIterator()
        :
        list_( NULL ) ,
        current_()
    {
        return ;
   }
    STLGlobIterator( char** list )
        :
        list_( list ) ,
        current_( *( list_ ) )
    {
        ++list_ ;
        return ;
    }
    STLGlobIterator( const STLGlobIterator& other )
        :
        list_( other.list_ ) ,
        current_( other.current_ )
    {
        return ;
    }
    self_reference operator=( const STLGlobIterator& other ){
        if( this == &other ){
            return( *this ) ;
        }
        list_ = other.list_ ;
        current_ = other.current_ ;
        return( *this ) ;
    }
    self_reference operator++(){
        if( NULL != *list_ ){
            current_ = *list_ ;
            ++list_ ;
        } else{
            current_ = "[past the end!!]" ;
            list_ = NULL ;
        }
        return( *this ) ;
    }
    self_type operator++(int){
        self_type result( *this ) ;
        ++( *this ) ;
        return( result ) ;
    }
    bool operator==( const self_reference other ){
        return( other.list_ == this->list_ ) ;
    }
    bool operator!=( const self_reference other ){
        return( ! ( (*this) == other ) ) ;
    }
    reference operator*(){
        return( current_ ) ;
    }
    reference operator->(){
        return( *( *this ) ) ;
    }
    private:
    char** list_ ;
    std::string current_ ;
} ;