2012-11-08 12 views
9

私はboost::rangeライブラリを通過し、boost :: range_iteratorとboost::iterator_rangeに気付きました。私はここでこれらの用語と混同しています。誰も何が2つの違いと何を使用するか説明してください?また、ブースト・レンジ・ライブラリを使用してドキュメンテーションとは別のサンプル・サンプルを紹介することができれば、いいかもしれません。ありがとうboost :: range_iteratorとboost :: iterator_rangeの混乱

答えて

7

2人と何時何の違いがあるのか​​説明してください。

range_iteratorは、次のように範囲イテレータのGETタイプのために使用されます。

range_iterator<SomeRange>::type 

それはsimillar std::iterator_traitsに何かに。たとえば、あなたはイテレータから値型を取得することがあります。

std::iterator_traits<int*>::value_type 

iterator_rangeは範囲とイテレータの間のブリッジです。たとえば、イテレータのペアがあり、範囲を受け入れるアルゴリズムに渡したいとします。その場合、iterator_rangeを使用してイテレータを範囲にラップすることができます。または、より良い - make_iterator_range - それは種類を推測するのに役立ちます(STDのように:: 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は、既存のイテレータのペアから新しい範囲を作成するために使用されます。これは、イテレータベースのコードを使用し、それを使用して範囲に変換するコードを使用するときに、通常は使用する可能性が高くなります。