Namespaces
Variants

std::ranges:: views:: adjacent, std::ranges:: adjacent_view, std::ranges:: views:: pairwise

From cppreference.net
Ranges library
Range adaptors
adjacent_view views::adjacent
(C++23) (C++23)
views::pairwise
(C++23)

ヘッダーで定義 <ranges>
template < ranges:: forward_range V, std:: size_t N >

requires ranges:: view < V > && ( N > 0 )
class adjacent_view

: public ranges:: view_interface < adjacent_view < V, N >>
(1) (C++23以降)
namespace views {

template < std:: size_t N >
constexpr /* 未規定 */ adjacent = /* 未規定 */ ;

}
(2) (C++23以降)
namespace views {

inline constexpr auto pairwise = adjacent < 2 > ;

}
(3) (C++23以降)
呼び出しシグネチャ
template < ranges:: viewable_range R >

requires /* 下記参照 */

constexpr ranges:: view auto adjacent < N > ( R && r ) ;
(C++23以降)
1) adjacent_view は、 view を受け取り、 view を生成する範囲アダプタであり、その i th 番目の要素(「ウィンドウ」)は、元のビューの要素 [ i , i + N - 1 ] への N 個の参照を保持する std::tuple である。
元のビューのサイズを 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 ) それ以外の場合。
3) 名前 views :: pairwise は、 RangeAdaptorObject を正確に表すものであり、 views :: adjacent < 2 > と完全に同じ動作をします。

adjacent_view は常に forward_range をモデルし、また適応された view 型が対応するコンセプトをモデルする場合、 bidirectional_range random_access_range または sized_range もモデルします。

目次

データメンバ

メンバー 説明
V base_ 基となる view
( 説明専用メンバーオブジェクト* )

メンバー関数

adjacent_view を構築する
(public member function)
先頭を指すイテレータを返す
(public member function)
終端を指すイテレータまたはセンチネルを返す
(public member function)
要素数を返す(基となる範囲が sized_range を満たす場合のみ提供)
(public member function)
結果の approximately_sized_range の近似サイズを返す
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の定数イテレータのセンチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの先頭要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの末尾要素を返す( bidirectional_range かつ common_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの n 番目の要素を返す( random_access_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)

推論ガイド

(なし)

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )
adjacent_view common_range でない場合に使用されるセンチネル型
( 説明専用メンバクラステンプレート* )

ヘルパーテンプレート

template < class V, size_t N >

constexpr bool ranges:: enable_borrowed_range < adjacent_view < V, N >> =

ranges:: enable_borrowed_range < V > ;
(C++23以降)

この ranges::enable_borrowed_range の特殊化は、基となるビューが 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 の隣接要素に対する結果からなる
(クラステンプレート) (range adaptor object)
他の view のM th から(M + N - 1) th 要素を表す view をM th 要素とする
(クラステンプレート) (range adaptor object)
他の view の要素をNサイズの非重複連続チャンクとした view s の範囲
(クラステンプレート) (range adaptor object)
他の view の要素からなり、一度にN要素進む
(クラステンプレート) (range adaptor object)