9

があり、から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));

驚くべきことに、(GCC 4.1.2 を使用して) 動作します。それがどのように機能するのか興味があります。iterator_rangeそれを行うコンストラクターのオーバーロードは見つかりませんでしmultimap::iterator_rangeた。明らかに、ブースト範囲を返すオーバーロードもありません。

4

1 に答える 1

9

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に移動しますboost::begin。私たちが見ているのbegin.hppを見ると(他のvoodooの中でも):

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

また、型を範囲に「適応」させる方法の例については、こちらをご覧ください(pair例として使用しています)。

于 2012-04-16T09:59:31.857 に答える