2012-11-08 15 views
9

boost::range kitaplığından geçiyorum ve boost :: range_iterator ve boost::iterator_range öğelerini fark ettim. Burada bu terimlerle karıştırıldım. Herkes, iki arasındaki farkın ne olduğunu ve ne zaman kullanılacağını açıklayabilir mi? Ayrıca, genişletme aralığı kitaplığının belgelerin dışında daha fazlasını tanımak için kullanıldığı örnekleri örneklemeye yönlendirebilirseniz çok güzel olur. Teşekkürlerboost :: range_iterator ve boost :: iterator_range karışıklığı

cevap

7

İki kişi arasındaki farkın ne olduğunu ve ne zaman kullanılacağını açıklayabilir misiniz?

range_iterator şu şekilde aralığı yineleyici olsun türü için kullanılır:

range_iterator<SomeRange>::type 

Bu simillar std::iterator_traits için bir şey. Örneğin, İlerleticiden değer türünü alabilirsiniz:

std::iterator_traits<int*>::value_type 

iterator_range aralıkları ve yineleyiciler arasındaki köprüdür. Örneğin - yineleyici çiftiniz var ve bunları yalnızca aralık kabul eden algoritmaya yönlendirmek istiyorsunuz. Bu durumda yineleyicilerinizi iterator_range kullanarak kapsama alabilirsiniz. Ya da daha - make_iterator_range - bu tipini anlar yardımcı olacaktır (std gibi :: make_pair yapar):

make_iterator_range(iterator1,iterator2) 

döner değişir. boost aralığı kütüphane dışında bu konuda daha fazla bilgi edinmek için kullanılır nerede örnekleri örneklemek için beni işaret edebilir Ayrıca

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()); 
} 

, çok güzel olurdu:

Örneğin aşağıdaki düşünün hızlı özeti için dokümantasyon

- check this slides

3

Genel olarak, boost::range_iterator'u doğrudan kullanmazsınız, çünkü verilen aralığı alan (aralığın türüne bakmaksızın) bir şablon meta işlevidir ve begin()/end() yöntemlerinin türünü döndürür. Önceden varolan yineleyicilerden yeni bir dizi oluşturmak için

boost::iterator_range kullanılır. Bu, genellikle hala yineleyici tabanlı bir kod alırken ve bunu bir aralığa dönüştürmek için kullanıldığında, kullanım olasılığınız daha yüksek olacaktır.