std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::forward_range V, std::size_t N > requires ranges::view<V> && (N > 0) |
(1) | (C++23から) |
| namespace views { template< std::size_t N > |
(2) | (C++23から) |
| namespace views { inline constexpr auto pairwise = adjacent<2>; |
(3) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++23から) | |
1)
adjacent_view は、view を受け取り、元のビューの i番目から i + N - 1番目までの要素への N 個の参照を保持する std::tuple である i番目の要素(「ウィンドウ」)を生成する範囲アダプタです。 元のビューのサイズを
S とします。このとき、生成されるビューのサイズは以下のようになります。- S - N + 1 (
S >= Nの場合) - 0 (それ以外の場合、結果のビューは空になります)
2) 名前 views::adjacent<N> は RangeAdaptorObject を表します。サブ式 e と定数式 N が与えられた場合、式 views::adjacent<N>(e) は以下と 式的に等価 です。
- ((void)e, auto(views::empty<tuple<>>)) (N が 0 に等しく、decltype((e)) が
forward_rangeをモデルする場合) - adjacent_view<views::all_t<decltype((e))>, N>(e) (それ以外の場合)
adjacent_view は常に forward_range をモデルし、アダプトされた view 型が対応するコンセプトをモデルする場合、bidirectional_range、random_access_range、または sized_range をモデルします。
目次 |
[編集] データメンバー
| メンバ名 | 定義 |
base_ (プライベート) |
型 V の基底 view。(説明用のメンバオブジェクト*) |
[編集] メンバ関数
adjacent_view を構築する(public メンバ関数) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (public メンバ関数) | |
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す(public メンバ関数) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論補助
(なし)
[編集] ネストされたクラス
| イテレータ型 (説明専用メンバクラステンプレート*) | |
adjacent_view が common_range でない場合に使用されるセンチネル型(説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class V, size_t N > constexpr bool ranges::enable_borrowed_range<adjacent_view<V, N>> = |
(C++23から) | |
ranges::enable_borrowed_range のこの特殊化により、基底のビューがこれを満たす場合、adjacent_view は borrowed_range を満たします。
[編集] ノート
views::adjacent は、N が 0 の場合でもフォワードレンジのみを受け入れます。
ranges::adjacent_view と ranges::slide_view には類似点があります
- どちらもサイズ
Nの「スライディングウィンドウ」を作成します。 - どちらも同じサイズ
S - N + 1を持ちます。ここで、Sはアダプトされたviewのサイズであり、S >= N > 0が成り立ちます。
以下の表は、これらのアダプタの違いを示しています。
| ビューアダプタ | value_type |
ウィンドウサイズ N |
|---|---|---|
| ranges::adjacent_view | std::tuple | テンプレートパラメータ |
| ranges::slide_view | ranges::range | 実行時引数 |
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_zip |
202110L |
(C++23) | ranges::zip_view, ranges::zip_transform_view, ranges::adjacent_view,ranges::adjacent_transform_view |
[編集] 例
このコードを実行
#include <array> #include <format> #include <iostream> #include <ranges> #include <tuple> int main() { constexpr std::array v{1, 2, 3, 4, 5, 6}; std::cout << "v = [1 2 3 4 5 6]\n"; for (int i{}; std::tuple t : v | std::views::adjacent<3>) { auto [t0, t1, t2] = t; std::cout << std::format("e = {:<{}}[{} {} {}]\n", "", 2 * i++, t0, t1, t2); } }
出力
v = [1 2 3 4 5 6] e = [1 2 3] e = [2 3 4] e = [3 4 5] e = [4 5 6]
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 4098 | C++23 | views::adjacent<0> はかつて入力専用範囲を受け入れていました。 | 拒否されるようになりました |
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 26.7.25 隣接ビュー [range.adjacent]
[編集] 関連項目
適合するviewの隣接する要素に変換関数を適用した結果からなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
M番目の要素が別のviewのM番目から(M + N - 1)番目の要素に対するviewであるview(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素からなり、一度にN個の要素を飛ばして進む view(クラステンプレート) (rangeアダプタオブジェクト) |