2012-04-16 7 views
6

Ich habe eine std::multimap, und ich möchte eine boost::iterator_range von equal_range erstellen. Ich fand keine einfache Möglichkeit, es in der Dokumentation zu tun, also habe ich versucht die folgenden:Konvertieren std :: Paar Iteratoren zu boost :: iterator_range

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

Überraschenderweise funktioniert es (mit GCC 4.1.2). Ich bin gespannt wie es funktioniert. Ich fand keine Überlastung für iterator_range Konstruktor, der es tun würde, und multimap::iterator_range hat offensichtlich keine Überladung, die Boost-Bereiche zurückgeben würde.

+1

Beachten Sie, dass es auch 'boost :: make_iterator_range' gibt, das den zugrunde liegenden Iteratortyp aus dem Paar ableitet. – alfC

Antwort

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 bringt Sie zu boost::begin. Mit einem Blick auf begin.hpp sehen wir (unter anderem Voodoo): kann

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

Und für ein Beispiel, wie Typen in Bereiche haben einen Blick here „angepasst“ werden (sie verwenden pair als Beispiel).

Verwandte Themen