blocked_range

[algorithms.blocked_range]

再帰的に分割可能な半開区間のクラス・テンプレート。

blocked_range は、再帰的に分割できる半開区間 [i,*j*) を表します。

blocked_range は、Range 要件を満たします。

blocked_range には size_t タイプの grain size を指定します。

範囲サイズが grain size を超える場合、blocked_range は 2 つのサブ範囲に分割できます。理想的な粒度は、範囲を引数とするテンプレート parallel_forparallel_reduce、または parallel_scanblocked_range のコンテキストに依存します。


// <oneapi/tbb/blocked_range.h> ヘッダーで定義 

namespace oneapi { 
    namespace tbb { 

        template<typename Value> 
        class blocked_range { 
        public:         
            // types 
            using size_type = size_t; 
            using const_iterator = Value; 

            // constructors 
            blocked_range( Value begin, Value end, size_type grainsize=1 ); 
            blocked_range( blocked_range& r, split ); 
            blocked_range( blocked_range& r, proportional_split& proportion ); 

            // capacity 
            size_type size() const; 
            bool empty() const; 

            // access 
            size_type grainsize() const; 
            bool is_divisible() const; 

            // iterators const_iterator begin() const; 
            const_iterator end() const; 

        }; 

    } // namespace tbb 
} // namespace oneapi

要件:

メンバー関数

type size_type

blocked_range のサイズを測定するタイプです。タイプは常に size_tです。

type const_iterator

範囲内の値のタイプです。その名前に反して、const_iterator タイプは必ずしも STL イテレーターとは限りません。BlockedRangeValue の要件を満たす必要があるだけです。ただし、blocked_range は読み取り専用の STL のように動作するため、const_iterator を呼び出すと便利です。

blocked_range(Value begin, Value end, size_type grainsize = 1)

要件: パラメーター grainsize は正の値である必要があります。この要件が満たされない場合、ライブラリーのデバッグバージョンはエラーを報告します。

効果: 指定された grainsize で、半開区間 [begin, end) に相当する blocked_range を作成します。

: "blocked_range<int> r(5, 14, 2);」 は、5 から 13 の値を含む粒度が 2 の int の範囲を作成します。その後、r.begin()==5 および r.end()==14 になります。

blocked_range(blocked_range &range, split)

基本分割コンストラクター。

要件: is_divisible() は true です。

効果: range を 2 つのサブ範囲に分割します。新しく作成される blocked_range は、ほぼ元の range の半分で、range はその残りになるように更新されます。各サブ範囲の粒度は、オリジナルの範囲と同じ grainsize になります。

: r を、粒度 g で半開区間 [i, j) を表す blocked_range であるとします。blocked_range<int> s(r, split); を実行します。r は [i, i+(j-i)/2)s[i+(j-i)/2, j) で、どちらも g の粒度を持ちます。

blocked_range(blocked_range &range, proportional_split proportion)

比例分割コンストラクター。

要件: is_divisible() は true です。

効果: range をサイズの比率が proportion.left()proportion.right() の比率に近くなるよう 2 つのサブ範囲に分割します。新しく作成される blocked_range は、右のサブ範囲の範囲であり、rangeは左のサブ範囲になるように更新されます。

: r を、粒度 g で半開区間 [i, j) を表す blocked_range であるとします。blocked_range<int> s(r, proportional_split(2, 3)); を実行します。r[i, i+2*(j-i)/(2+3))s[i+2*(j-i)/(2+3), j) で、どちらも g の粒度を持ちます。

size_type size() const

要件: end()<begin() の場合 false を返します。

効果: 範囲のサイズを決定します。

戻り値: end()-begin()

bool empty() const

効果: range が空かどうかを判別します。

戻り値: !(begin()<end()) を返します。

size_type grainsize() const

戻り値: 範囲の粒度。

bool is_divisible() const

要件: end()<begin() は false を返します。

効果: range が subrange に分割できるかどうかを判別します。

戻り値: size()>grainsize() であれば true、それ以外は false を返します。

const_iterator begin() const

戻り値: 範囲の包括的下限。

const_iterator end() const

戻り値: 範囲の排他的上限。

参照: