Namespaces
Variants

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

ja.cppreference.net から
 
 
レンジライブラリ
レンジアダプタ
 
 
ヘッダで定義されています<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) (since C++23)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent = /* unspecified */ ;
}
(2) (since C++23)
namespace views {
    inline constexpr auto pairwise = adjacent<2>;
}
(3) (since C++23)
呼び出しシグネチャ
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto adjacent<N>( R&& r );
(since C++23)
1) adjacent_viewは、1つのviewを受け取り、viewを生成します。そのith番目の要素(「窓」)は、std::tupleを保持するN要素への参照[i, i + N - 1]元のviewの構成要素です。
元のviewのサイズをSとします。生成されるviewのサイズは次のようになります:
  • S - N + 1 if S >= N,
  • 0 それ以外の場合は空です。
2) 名前views::adjacent<N>はRangeAdaptorObjectを表します。部分式eと定数式Nが与えられたとき、式views::adjacent<N>(e)はexpression-equivalentです。つまり、
  • ((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)
ranges::view_interface
派生ビューが空かどうかを返す。次の条件を満たす場合のみ使用可能: sized_range または forward_range
(std::ranges::view_interface<D>のパブリックメンバ関数)
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D>のパブリックメンバ関数)
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューが空でないかどうかを返す。次の条件を満たす場合のみ: ranges::empty がそれに適用可能
(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最初の要素を返す。次の条件を満たす場合: forward_range
(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最後の要素を返す。次の条件を満たす場合のみ: bidirectional_range かつ common_range
(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの n番目 の要素を返す。次の条件を満たす場合のみ: random_access_range
(std::ranges::view_interface<D>のパブリックメンバ関数)

推論ガイド

(なし)

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )
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)