2012-04-16 8 views
6

Tengo un std::multimap, y quiero crear un boost::iterator_range desde equal_range. He encontrado hay una forma sencilla de hacerlo en la documentación, así que probé el siguiente:Convertir std :: par de iteradores para aumentar :: iterator_range

typedef std::multimap<int, std::string> Map; 
Map map; 
... 
boost::iterator_range<Map::iterator> r(map.equal_range(2)); 

Sorprendentemente, funciona (usando GCC 4.1.2). Tengo curiosidad de cómo funciona. No encontré ninguna sobrecarga para el constructor iterator_range que lo haría, y obviamente multimap::iterator_range no tiene sobrecarga que pueda devolver los rangos de Boost.

+1

Tenga en cuenta que también hay 'boost :: make_iterator_range' que deduce el tipo de iterador subyacente del par. – alfC

Respuesta

7

iterator_range_core.hpp:

//! Constructor from a Range 
template< class Range > 
iterator_range(const Range& r) : 
    m_Begin(impl::adl_begin(r)), m_End(impl::adl_end(r)) 
{} 

impl::adl_begin le lleva a boost::begin. Echar un vistazo a begin.hpp vemos (entre otros vudú):

template< typename Iterator > 
inline Iterator range_begin(const std::pair<Iterator,Iterator>& p) 
{ 
    return p.first; 
} 

Y para un ejemplo de cómo los tipos se pueden “adaptar” en rangos de echar un vistazo here (utilizan pair como ejemplo).

Cuestiones relacionadas