
2010/12/25 Shevchenko Denis <for.dshevchenko@gmail.com>
Hi friends!
Between work on my Configurator (beta version on the way) I remembered an old idea to simplify work with STL algorithms. This is not a library, but just a simple wrapperaround algorithms from <algorithm> header. Main purpose of this - deliverance from direct work with iterators.
Iterators is the perfect tool, but it is often a source of stupidmistakes:
typedef std::vector< int > V; typedef V::iterator Vit; V v1 = list_of( 1 )( 2 )( 3 ); Vitit1 = std::find( v1.begin(), v1.begin(), 2 ); // Oops, we use same iterator...
V v2 = list_of( 34 )( 56 )( 78 ); Vitit2 = std::find( v2.begin(), v1.end(), 56 ); // Oops, we use iterators from different containers...
The most offensive is that such mistakes are not detected at compile-time (at least in GCC), because, strictly speaking,it is not language error, but logical error.Sometimes I make such mistakes in my code...
Possible solution:
template < typename Container , typename Value
inline typename Container::const_iterator simple_find( const Container& cont, const Value& value ) { return std::find( cont.begin(), cont.end(), value ); }
or like this:
template < typename Container , typename Value
inline typename boost::range_iterator< const Container >::type simple_find( const Container& cont, const Value& value ) { return std::find( boost::begin( cont ), boost::end( cont ), value ); }
In this case we can write:
V v1 = list_of( 1 )( 2 )( 3 ); Vitit1 = simple_find( v1, 2 );
V v2 = list_of( 34 )( 56 )( 78 ); Vitit2 = simple_find( v2, 56 );
Similarly possible to wrap all of the standard algorithms, that will simplify code and improve its reliability.
Additionally it is possible to simplify the writing of standard idioms, for example:
template < typename Container , typename Value
inline void simple_erase_all( Container& cont, const Value& value ) { cont.erase( std::remove( boost::begin( cont ), boost::end( cont ), value ), boost::end( cont ) ); }
Example of code:
V v3 = list_of( 111 )( 333)( 333 ); simple_erase_all( v3, 333 );
I think that this wrapper could be a part ofBoost.Utility.
What do you think about it?
If I understand correctly, you might want to take a look into Boost.Range. See: http://www.boost.org/doc/libs/1_45_0/libs/range/doc/html/range/reference/alg...