std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise
| ヘッダで定義されています <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) | |
adjacent_viewは、1つのviewを受け取り、viewを生成します。そのith番目の要素(「窓」)は、std::tupleを保持するN要素への参照[i, i + N - 1]元のviewの構成要素です。Sとします。生成されるviewのサイズは次のようになります:
S - N + 1ifS >= N,0それ以外の場合は空です。
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)そうでなければ、
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) |
|
|
(C++26)
|
結果の
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
>>
=
|
(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) |
|
|
(C++23)
|
他の
view
のM
th
から(M + N - 1)
th
要素を表す
view
をM
th
要素とする
(クラステンプレート) (range adaptor object) |
|
(C++23)
|
他の
view
の要素をNサイズの非重複連続チャンクとした
view
s
の範囲
(クラステンプレート) (range adaptor object) |
他の
view
の要素からなり、一度にN要素進む
(クラステンプレート) (range adaptor object) |