名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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を受け取り、すべてのビューのi番目の要素から構成されるタプルライクな値がi番目の要素となる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_rangebidirectional_rangerandom_access_range、またはsized_rangeをモデル化する。

zip_viewは、以下の場合にcommon_rangeをモデル化する。

  • sizeof...(Views)1に等しく、唯一のアダプトされたビュー型がcommon_rangeをモデル化する場合、または
  • 少なくとも1つのアダプトされたビュー型がbidirectional_rangeをモデル化せず、すべてのアダプトされたビュー型がcommon_rangeをモデル化する場合、または
  • すべてのアダプトされたビュー型がrandom_access_rangesized_rangeの両方をモデル化する場合。

目次

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

views::zipという名前は、リテラルsemiregularクラス型のconst 関数オブジェクトであるカスタマイゼーションポイントオブジェクトを表す。説明のために、その型のcv-非修飾バージョンは__zip_fnと表記される。

__zip_fnのすべてのインスタンスは等しい。同じ引数に対して異なる型の__zip_fnのインスタンスを呼び出した効果は、インスタンスを表す式が左辺値か右辺値か、const修飾されているかどうかにかかわらず等価である(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はない)。したがって、views::zipは自由にコピーでき、そのコピーは互換的に使用できる。

Args...の集合が与えられたとき、std::declval<Args>()...が上記のviews::zipの引数の要件を満たす場合、__zip_fnは以下をモデル化する。

それ以外の場合、__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_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[編集] 推論ガイド

[編集] ネストされたクラス

イテレータ型
(説明専用メンバクラステンプレート*)
zip_viewcommon_rangeではない場合に使用される番兵型
(説明専用メンバクラステンプレート*)

[編集] ヘルパーテンプレート

template< class... Views >

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

    (ranges::enable_borrowed_range<Views> && ...);
(C++23から)

ranges::enable_borrowed_rangeのこの特殊化により、各基盤となるビューがこれを満たす場合、zip_viewborrowed_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アダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)