std::ranges::views::counted
| ヘッダ <ranges> で定義 |
||
| inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(C++20以降) | |
| 呼び出しシグネチャ |
||
| template< class Iterator, class DifferenceType > requires /* 以下を参照 */ |
(C++20以降) | |
counted view は、あるイテレータ `i` と非負整数 `n` に対する「counted range」 [i, n) の view を表します。
counted range [i, n) とは、`i` が指す要素から始まり、`n` 回 ++i を適用した結果が指す要素(もしあれば)の直前までの、`n` 個の要素のことです。
もし n == 0 ならば、counted range は有効で空です。そうでなければ、counted range は `n` が正であり、`i` がデリファレンス可能であり、かつ [++i, --n) が有効な counted range である場合にのみ有効です。
形式的には、`it` と `count` が式であり、`T` が std::decay_t<decltype((it))> であり、`D` が std::iter_difference_t<T> である場合、
- もし `T` が
input_or_output_iteratorをモデル化し、かつ `decltype((count))` が std::convertible_to<D> をモデル化するならば、- もし `T` が
contiguous_iteratorをモデル化するならば、views::counted(it, count) は expression-equivalent に std::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))) になります。 - そうでなく、もし `T` が
random_access_iteratorをモデル化するならば、views::counted(it, count) は expression-equivalent に ranges::subrange(it, it + static_cast<D>(count)) になります。 - そうでなければ、views::counted(it, count) は expression-equivalent に ranges::subrange(std::counted_iterator(it, count), std::default_sentinel) になります。
- もし `T` が
- それ以外の場合、views::counted(it, count) は ill-formed です。
目次 |
カスタマイゼーションポイントオブジェクト
views::counted という名前は、customization point object を指します。これは、const で FunctionObject であり、literal かつ semiregular なクラス型です。説明のため、cv-unqualified 版の型は __counted_fn と表記されます。
__counted_fn のすべてのインスタンスは等価です。同じ引数に対して異なるインスタンスの __counted_fn 型を呼び出した際の効果は、インスタンスを表す式が lvalue か rvalue か、また const 修飾されているかどうかに関わらず(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)、等価です。したがって、views::counted は自由にコピーでき、そのコピーは互換性があります。
型 Args... のセットが与えられたとき、もし std::declval<Args>()... が上記の views::counted への引数の要件を満たすならば、__counted_fn は以下をモデル化します。
- std::invocable<__counted_fn, Args...>,
- std::invocable<const __counted_fn, Args...>,
- std::invocable<__counted_fn&, Args...>、および
- std::invocable<const __counted_fn&, Args...>.
それ以外の場合、__counted_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] 注記
views::counted は、range が `count` 要素すべてを提供するのに十分な長さであるかチェックしません。そのチェックが必要な場合は、views::take を使用してください。
[編集] 例
#include <iostream> #include <ranges> int main() { const int a[]{1, 2, 3, 4, 5, 6, 7}; for (int i : std::views::counted(a, 3)) std::cout << i << ' '; std::cout << '\n'; const auto il = {1, 2, 3, 4, 5}; for (int i : std::views::counted(il.begin() + 1, 3)) std::cout << i << ' '; std::cout << '\n'; }
出力
1 2 3 2 3 4
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2393R1 | C++20 | 整数クラス型から std::size_t への暗黙の変換が無効である可能性があります。 | 明示的にされました |
[編集] 関連項目
| (C++20) |
別のviewの最初のN個の要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) |
| (C++20) |
イテレータと番兵のペアをviewに結合する(クラステンプレート) |
| (C++20) |
範囲の終端までの距離を追跡するイテレータアダプタ (クラステンプレート) |
| (C++20)(C++20) |
特定の基準を満たす要素の数を返す (アルゴリズム関数オブジェクト) |