2012-04-16 20 views
6

Ho uno std::multimap e voglio creare uno boost::iterator_range da equal_range. Ho trovato un modo semplice di farlo nella documentazione, così ho provato la seguente:Conversione di std :: coppia di iteratori per aumentare :: iterator_range

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

Sorprendentemente, funziona (usando GCC 4.1.2). Sono curioso di sapere come funziona. Non ho trovato alcun sovraccarico per il costruttore iterator_range che lo farebbe, e multimap::iterator_range ovviamente non ha sovraccarico che restituirebbe intervalli di incremento.

+1

Nota che esiste anche "boost :: make_iterator_range' che deduce il tipo di iteratore sottostante dalla coppia. – alfC

risposta

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 ti porta a boost::begin. Avere uno sguardo a begin.hpp vediamo (tra le altre voodoo):

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

E per un esempio di come i tipi possono essere “adattati” in campi di uno sguardo here (usano pair come esempio).

Problemi correlati