std::ranges::views::zip, std::ranges::zip_view
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range... Views > requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) |
(1) | (C++23から) |
| namespace views { inline constexpr /*unspecified*/ zip = /*unspecified*/; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range... Rs > requires /* 以下を参照 */ |
(C++23から) | |
zip_viewは、1つ以上のviewを受け取り、すべてのビューのi番目の要素から構成されるタプルライクな値がi番目の要素となるviewを生成するレンジアダプタである。生成されるビューのサイズは、すべてのアダプトされたビューのサイズの最小値となる。views::zipはカスタマイゼーションポイントオブジェクトである。引数なしで呼び出す場合、views::zip()は式として等価であるauto(views::empty<std::tuple<>>)。
zip_viewは常にinput_rangeをモデル化し、すべてのアダプトされたview型が対応するコンセプトをモデル化する場合、forward_range、bidirectional_range、random_access_range、またはsized_rangeをモデル化する。
zip_viewは、以下の場合にcommon_rangeをモデル化する。
- sizeof...(Views)が1に等しく、唯一のアダプトされたビュー型が
common_rangeをモデル化する場合、または - 少なくとも1つのアダプトされたビュー型が
bidirectional_rangeをモデル化せず、すべてのアダプトされたビュー型がcommon_rangeをモデル化する場合、または - すべてのアダプトされたビュー型が
random_access_rangeとsized_rangeの両方をモデル化する場合。
目次 |
カスタマイゼーションポイントオブジェクト
views::zipという名前は、リテラルなsemiregularクラス型のconst 関数オブジェクトであるカスタマイゼーションポイントオブジェクトを表す。説明のために、その型のcv-非修飾バージョンは__zip_fnと表記される。
__zip_fnのすべてのインスタンスは等しい。同じ引数に対して異なる型の__zip_fnのインスタンスを呼び出した効果は、インスタンスを表す式が左辺値か右辺値か、const修飾されているかどうかにかかわらず等価である(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はない)。したがって、views::zipは自由にコピーでき、そのコピーは互換的に使用できる。
型Args...の集合が与えられたとき、std::declval<Args>()...が上記のviews::zipの引数の要件を満たす場合、__zip_fnは以下をモデル化する。
- std::invocable<__zip_fn, Args...>,
- std::invocable<const __zip_fn, Args...>,
- std::invocable<__zip_fn&, Args...>、および
- std::invocable<const __zip_fn&, Args...>.
それ以外の場合、__zip_fnの関数呼び出し演算子はいずれもオーバーロード解決に参加しない。
[編集] データメンバー
| メンバ | 説明 |
std::tuple<Views...> views_ |
すべてのアダプトされたビューオブジェクト (説明用のメンバオブジェクト*) |
[編集] メンバ関数
zip_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 メンバ関数) | |
[編集] 推論ガイド
[編集] ネストされたクラス
| イテレータ型 (説明専用メンバクラステンプレート*) | |
zip_viewがcommon_rangeではない場合に使用される番兵型(説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class... Views > constexpr bool enable_borrowed_range<ranges::zip_view<Views...>> = |
(C++23から) | |
ranges::enable_borrowed_rangeのこの特殊化により、各基盤となるビューがこれを満たす場合、zip_viewはborrowed_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 <iostream> #include <list> #include <ranges> #include <string> #include <tuple> #include <vector> void print(auto const rem, auto const& range) { for (std::cout << rem; auto const& elem : range) std::cout << elem << ' '; std::cout << '\n'; } int main() { auto x = std::vector{1, 2, 3, 4}; auto y = std::list<std::string>{"α", "β", "γ", "δ", "ε"}; auto z = std::array{'A', 'B', 'C', 'D', 'E', 'F'}; print("Source views:", ""); print("x: ", x); print("y: ", y); print("z: ", z); print("\nzip(x,y,z):", ""); for (std::tuple<int&, std::string&, char&> elem : std::views::zip(x, y, z)) { std::cout << std::get<0>(elem) << ' ' << std::get<1>(elem) << ' ' << std::get<2>(elem) << '\n'; std::get<char&>(elem) += ('a' - 'A'); // modifies the element of z } print("\nAfter modification, z: ", z); }
出力
Source views: x: 1 2 3 4 y: α β γ δ ε z: A B C D E F zip(x,y,z): 1 α A 2 β B 3 γ C 4 δ D After modification, z: a b c d E F
[編集] 関連項目
適合するviewの対応する要素に変換関数を適用した結果からなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
tuple-like な値からなるviewと数値Nを取り、各タプルのN番目の要素のviewを生成する(クラステンプレート) (rangeアダプタオブジェクト) |