2012-11-08 37 views
9

我一直在經歷boost::range庫,並注意到boost :: range_iterator和boost::iterator_range。我對這些條款感到困惑。任何人都可以請解釋兩者之間有什麼區別,什麼時候使用什麼?此外,如果您可以指點我使用boost範圍庫來了解除文檔以外的更多關於它的示例,那將是非常好的。謝謝boost :: range_iterator和boost :: iterator_range混淆

回答

7

任何人都可以請解釋兩者之間有什麼區別,什麼時候使用什麼?

range_iterator用於獲取類型範圍迭代器的方式如下:

range_iterator<SomeRange>::type 

它呈三角在東西std::iterator_traits。舉例來說,你可以從迭代器獲取的值類型:

std::iterator_traits<int*>::value_type 

iterator_range的是範圍和迭代器之間的橋樑。例如 - 你有一對迭代器,並且你想把它們傳遞給只接受範圍的算法。在這種情況下,您可以使用iterator_range將迭代器包裝到範圍中。或者更好 - make_iterator_range - 這將有助於推斷類型(如性病:: make_pair一樣):

make_iterator_range(iterator1,iterator2) 

收益範圍。

考慮下面的例子:

live demo

#include <boost/range/iterator_range.hpp> 
#include <boost/range/algorithm.hpp> 
#include <boost/range/iterator.hpp> 
#include <typeinfo> 
#include <iostream> 
#include <ostream> 

using namespace boost; 
using namespace std; 

struct print 
{ 
    template<typename T> 
    void operator()(const T &t) const 
    { 
     cout << t << " "; 
    } 
}; 

int main() 
{ 
    typedef int Array[20]; 
    cout << typeid(range_iterator<Array>::type).name() << endl; 

    Array arr={11,22,33,44,55,66,77,88}; 
    boost::for_each(make_iterator_range(arr,arr+5) ,print()); 
} 

而且,這將是很好,如果你可以點我來樣例子,其中升壓範圍庫是用於瞭解更多關於它除了該文件

快速總結 - 檢查this slides

3

通常,您不會直接使用boost::range_iterator,因爲它是一個模板元函數,它接受給定的範圍(不考慮範圍的類型),並返回它的begin()/ end()方法的類型。

boost::iterator_range用於從一對預先存在的迭代器中創建一個新的範圍。這通常在使用仍然基於迭代器的代碼並將其用於範圍轉換時更有可能使用。

相關問題