2012-04-16 11 views
6

मेरे पास std::multimap है, और मैं equal_range से boost::iterator_range बनाना चाहता हूं। मैं दस्तावेज में यह करने का कोई सरल रास्ता मिल गया, तो मैं निम्नलिखित की कोशिश की:std :: iterator की जोड़ी को बढ़ावा देने के लिए :: iterator_range

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

हैरानी की बात है, यह (जीसीसी 4.1.2 का प्रयोग करके) काम करता है। मैं उत्सुक हूं कि यह कैसे काम करता है। मुझे iterator_range कन्स्ट्रक्टर के लिए कोई ओवरलोड नहीं मिला जो यह करेगा, और multimap::iterator_range स्पष्ट रूप से कोई अधिभार नहीं है जो बूस्ट श्रेणियों को वापस करेगा।

+1

ध्यान दें कि 'boost :: make_iterator_range' भी है जो जोड़ी से अंतर्निहित पुनरावर्तक प्रकार को कम करता है। – alfC

उत्तर

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_beginboost::begin पर ले जाता है। ( के बीच अन्य वूडू) begin.hpp पर एक नज़र हम देखते हैं के बाद:

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

और एक उदाहरण कैसे प्रकार कर सकते हैं "अनुकूलित" किया जा श्रेणियों में के लिए एक नज़र here है (वे एक उदाहरण के रूप pair उपयोग करें)।