⛓️
[C++] <ranges>のviewを見る14 - counted view
counted view
counted viewは元となるシーケンスの先頭から指定された個数の要素のシーケンスを生成するViewです。
#include <ranges>
int main() {
auto iota = std::views::iota(1);
for (int n : std::views::counted(std::ranges::begin(iota), 5)) {
std::cout << n; // 12345
}
}
このcounted viewはstd::ranges::couted_view
のようなクラスがあるわけではなく、生成するにはstd::views::counted
を使用します。views::counted
はカスタマイぜーションポイントオブジェクトであり、イテレータと生成するViewの要素数を受け取ってその種別によって、指定された数の要素を参照するstd::span
かstd::subrange
を返します。
ただ、views::counted
はrange adaptor objectではないのでパイプラインスタイルで使用することはできません。
take_view
との差異
counted viewはまさにtake_view
と同じことをしてくれますが、微妙に違いがあります。
-
take_view
はViewを受けるが、counted viewはイテレータを受け取る - counted viewはオーバラン防止のためのケアをしない
int main() {
int arr[] = {1, 2, 3};
// 範囲を飛び越す!
for (int n : std::views::counted(std::ranges::begin(arr), 5)) {
std::cout << n;
}
}
counted viewはイテレータに対してtake_view
相当のものを生成するための入り口であり、イテレータ一つではその範囲の終端は分からないのでオーバーランを防ぐことができないのです。
Discussion