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
戻り値: 範囲の排他的上限。
参照: