2012-04-16 40 views
6

Tôi có một std::multimap và tôi muốn tạo một boost::iterator_range từ equal_range. Tôi không tìm thấy cách đơn giản để thực hiện nó trong tài liệu, vì vậy tôi đã thử các cách sau:Chuyển đổi std :: cặp vòng lặp để tăng :: iterator_range

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

Đáng ngạc nhiên, nó hoạt động (sử dụng GCC 4.1.2). Tôi tò mò làm thế nào nó hoạt động. Tôi thấy không có tình trạng quá tải cho các nhà xây dựng iterator_range mà sẽ làm điều đó, và multimap::iterator_range rõ ràng là không có tình trạng quá tải sẽ trả về phạm vi Boost.

+1

Lưu ý rằng cũng có 'boost :: make_iterator_range' để loại trừ loại trình lặp cơ bản từ cặp. – alfC

Trả lời

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 sẽ đưa bạn đến boost::begin. Có một cái nhìn tại begin.hpp chúng ta thấy (trong số voodoo khác):

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

Và đối với một ví dụ như thế nào loại có thể được “chuyển thể” thành dãy có một cái nhìn here (họ sử dụng pair là một ví dụ).

Các vấn đề liên quan