将std :: pair迭代器转换为boost :: iterator_range

pet*_*ohn 7 c++ boost iterator boost-range

我有一个std::multimap,我想创建一个boost::iterator_rangeequal_range.我在文档中找不到简单的方法,所以我尝试了以下方法:

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

令人惊讶的是,它的工作原理(使用GCC 4.1.2).我很好奇它是如何工作的.我发现iterator_range构造函数没有重载会发生这种情况,multimap::iterator_range显然没有返回Boost范围的重载.

Ano*_*ous 8

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 ) )
{}
Run Code Online (Sandbox Code Playgroud)

impl::adl_begin带你去boost::begin.看看begin.hpp我们看到的(除了其他伏都教):

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

例如,如何将类型"调整"到范围中,可以看一下(它们pair用作示例).