2013-01-01 10 views
8

irangecounting_rangeの違いは何ですか?ブーストのirangeとcounting_rangeの差

私はすぐにこのような整数の範囲を生成するのにirangeが必要:

auto example = boost::irange(0, 5); /// result is {0, 1, 2, 3, 4} 

しかし、同じタスクを達成するためにcounting_rangeについての代わりに語っている(リンクを失った)どこかの例に気づきました。これら2つの違いの簡単な説明はありますか?

+2

これは、誤った情報が権威あるピアレビューされた事実としてどのように提示されるかについて、非常に驚​​くべき例でした。 –

答えて

27

irangeはランダムアクセス範囲であり、counting_rangeはランダムアクセス範囲ではありません。 counting_rangeはBoost.Iteratorのcounting_iteratorに基づいており、基本的な整数演算をすべて直接使用します。 C++の整数はイテレータのコンセプトにほぼ合っています。欠けているのはoperator*です。 counting_iteratorは、恒等操作としてoperator*を提供し、他のすべてを基本タイプに転送します。

もう1つの違いはirangeはまた、それらの1

なし、これまで彼らは反復処理整数の全範囲を具体化しないので、彼らの両方がO(1)メモリを使用するよりも別の増分をサポートしていることです。

0

irangecounting_rangeは、整数型のランダムアクセス範囲をモデル化します。各範囲の種類は別に差が(より効果的に存在しない

if (CategoryOrTraversal is not use_default) 
    return CategoryOrTraversal 
else if (numeric_limits<Incrementable>::is_specialized) 
    return iterator-category(random_access_traversal_tag, Incrementable, const Incrementable&) 
else 
    return iterator-category(iterator_traversal<Incrementable>::type, Incrementable, const Incrementable&) 

したがって、そのようなboost::irange(0, 10)boost::counting_range(0, 10)ような単純な範囲について:counting_rangeのマニュアルが指摘するように、そのイテレータカテゴリには、以下のアルゴリズムに従って決定されますコース!)。しかし、irangeは、異なる刻み幅(例えば、boost::irange(0, 10, 2))で反復をサポートし、counting_rangeはまた、増分可能であり整数を完全にはモデル化しないタイプもサポートする。

関連する問題