2012-04-16 83 views
6

Mam std::multimap i chcę utworzyć boost::iterator_range z equal_range. Nie znalazłem prosty sposób robi to w dokumentacji, więc próbowałem następujące:Konwersja std :: para iteratorów na boost :: iterator_range

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

Zaskakująco, to działa (za pomocą GCC 4.1.2). Ciekawi mnie, jak to działa. Nie znalazłem przeciążenia dla konstruktora iterator_range, który by to zrobił, i multimap::iterator_range oczywiście nie ma przeciążenia, które zwróci zakresy wzmocnienia.

+1

Zauważ, że istnieje również 'boost :: make_iterator_range', które dedukuje podstawowy typ iteratora z pary. – alfC

Odpowiedz

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 zabierze cię do boost::begin. Zaglądając do begin.hpp widzimy (między innymi voodoo):

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

A dla przykładu, jak typy mogą być „przystosowana” do zakresów spojrzeć here (używają pair jako przykład).

Powiązane problemy