1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <map>
#include <string>
#include <vector>
#include <iostream>
template< typename KEY_TYPE, typename MAPPED_TYPE,
typename KEY_COMP = std::less<KEY_TYPE>,
typename ALLOCATOR_TYPE = std::allocator< std::pair<const KEY_TYPE,MAPPED_TYPE> > >
struct mapx : public std::map< KEY_TYPE, MAPPED_TYPE, KEY_COMP, ALLOCATOR_TYPE >
{
typedef std::map< KEY_TYPE, MAPPED_TYPE, KEY_COMP, ALLOCATOR_TYPE > base ;
typedef typename base::key_type key_type ;
typedef typename base::mapped_type mapped_type ;
typedef typename base::value_type value_type ;
typedef typename base::iterator iterator ;
typedef typename base::size_type size_type ;
// TODO: other typedefs
// TODO: 3 constructors
mapped_type& operator[] ( const key_type& key )
{
iterator iter = base::find(key) ;
if( iter != base::end() ) return iter->second ;
std::pair<iterator,bool> pair = insert( std::make_pair( key, mapped_type() ) ) ;
return pair.first->second ;
}
std::pair<iterator,bool> insert( const value_type& v )
{
std::pair<iterator,bool> pair = base::insert(v) ;
sequence.push_back( pair.first ) ;
return pair ;
}
// TODO: implement
// template< typename ITERATOR > void insert( ITERATOR begin, ITERATOR end ) ;
// iterator erase( iterator iter ) ;
// size_type erase( const key_type& key ) ;
// void erase( iterator from, iterator till ) ;
std::vector<iterator> sequence ;
struct sequence_iterator : std::iterator< std::forward_iterator_tag, mapx::value_type >
{
typedef typename std::vector<mapx::iterator>::iterator iterator_base ;
explicit sequence_iterator( iterator_base i ) : base_iter(i) {}
value_type& operator* () { return **base_iter ; }
value_type* operator-> () { return &**this ; }
sequence_iterator& operator++ () { ++base_iter ; return *this ; }
sequence_iterator operator++ ( int )
{ sequence_iterator temp = *this ; ++*this ; return temp ; }
bool operator== ( const sequence_iterator& that ) const
{ return base_iter == that.base_iter ; }
bool operator!= ( const sequence_iterator& that ) const
{ return !( *this == that ) ; }
iterator_base base_iter ;
};
sequence_iterator seq_begin() { return sequence_iterator( sequence.begin() ) ; }
sequence_iterator seq_end() { return sequence_iterator( sequence.end() ) ; }
// TODO: const_sequence_iterator, reverse_sequence_iterator, const_reverse_sequence_iterator
};
int main()
{
mapx<std::string,int> map ;
map[ "xyz" ] = 1 ;
map[ "zzz" ] = 2 ;
map[ "abc" ] = 3 ;
map[ "xyz" ] = 4 ;
map.insert( std::make_pair( "ABCD", 5 ) ) ;
map[ "pqr" ] = 6 ;
map.insert( std::make_pair( "ddd", 7 ) ) ;
map[ "abc" ] = 8 ;
for( mapx<std::string,int>::sequence_iterator iter = map.seq_begin() ;
iter != map.seq_end() ; ++iter )
std::cout << iter->first << ' ' << iter->second << '\n' ;
}
|