blocked_range
[algorithms.blocked_range]
再帰的に分割可能な半開区間のクラス・テンプレート。
blocked_range は、再帰的に分割できる半開区間 [i,*j*) を表します。
blocked_range は、Range 要件を満たします。
blocked_range には size_t タイプの grain size を指定します。
範囲サイズが grain size を超える場合、blocked_range は 2 つのサブ範囲に分割できます。理想的な粒度は、範囲を引数とするテンプレート parallel_for、parallel_reduce、または parallel_scan の blocked_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要件:
Valueタイプは、BlockedRangeValue 要件を満たしている必要があります。
メンバー関数
- 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
戻り値: 範囲の排他的上限。
参照:
