Namespaces
Variants

std::ranges:: views:: zip, std::ranges:: zip_view

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: input_range ... Views >

requires ( ranges:: view < Views > && ... ) && ( sizeof... ( Views ) > 0 )
class zip_view

: public ranges:: view_interface < zip_view < Views... >>
(1) (C++23以降)
namespace views {

inline constexpr /*unspecified*/ zip = /*unspecified*/ ;

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

requires /* 下記参照 */

constexpr ranges:: view auto zip ( Rs && ... rs ) ;
(C++23以降)
1) zip_view は1つ以上の view s を受け取り、その i 番目の要素が全てのビューの i th 要素から構成されるタプル様の値である view を生成する範囲アダプタです。生成されるビューのサイズは、全ての適応されたビューのサイズの最小値となります。
2) views::zip はカスタマイゼーションポイントオブジェクトです。

引数なしで呼び出した場合、 views :: zip ( ) 式等価 です auto ( views:: empty < std:: tuple <>> )

それ以外の場合、 views :: zip ( rs... ) 式等価 です ranges :: zip_view < views:: all_t < decltype ( ( rs ) ) > ... > ( rs... )

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

zip_view は以下の場合に common_range をモデル化します

目次

カスタマイゼーションポイントオブジェクト

views::zip という名前は カスタマイゼーションポイントオブジェクト を表します。これは 関数オブジェクト の const で リテラル semiregular クラス型です。詳細は CustomizationPointObject を参照してください。

データメンバ

メンバー 説明
std:: tuple < Views... > views_ すべての適応されたビューオブジェクト
( 説明専用メンバーオブジェクト* )

メンバー関数

zip_view を構築する
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたは番兵を返す
(公開メンバ関数)
各基となる(適合された)範囲が sized_range を満たす場合にのみ提供される要素数を返す
(公開メンバ関数)
std::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> の公開メンバ関数)

推論ガイド

ネストされたクラス

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

ヘルパーテンプレート

template < class ... Views >

constexpr bool enable_borrowed_range < ranges :: zip_view < Views... >> =

( ranges:: enable_borrowed_range < Views > && ... ) ;
(C++23以降)

この ranges::enable_borrowed_range の特殊化は、すべての基盤となるビューが 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'); // 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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
tuple-like 値からなる view と数値Nを受け取り、各タプルのN th 要素からなる view を生成する
(クラステンプレート) (レンジアダプタオブジェクト)