• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class template
    <ranges>

    std::ranges::zip_view

    namespace std::ranges {
      template<input_range... Views>
      requires (view<Views> && ...) && (sizeof...(Views) > 0)
      class zip_view : public view_interface<zip_view<Views...>> {…… }; // (1)
    
      namespace views {
        inline constexpr /*unspecified*/ zip = /*unspecified*/;      // (2)
      }
    }
    

    概要

    zip_viewは複数のRangeから要素を1つずつ取得したtupleを要素とするview

    zip_viewの要素を1つ取得するごとに、各Rangeの要素を1つずつ取得する。

    zipするRangeのサイズが異なっている場合、zip_viewのサイズはそれらの中で最小のサイズとなる。

    Rangeコンセプト

    borrowed sized output input forward bidirectional random_access contiguous common viewable view
    (1) (2) (3) (4) (5)

    効果

    • (2): 式views::zip(Es...)の効果は次の通り
      • Esが空でないとき、zip_view<views::all_t<decltype((Es))>...>(Es...) と等しい
      • Esが空のとき、auto(views::empty<tuple<>>) と等しい

    備考

    本説明に用いる説明専用要素を以下のように定義する。

    namespace std::ranges {
      // 説明専用
      template<class... Rs>
      concept zip-is-common =
        (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) ||
        (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) ||
        ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...));
    }
    

    メンバ関数

    名前 説明 対応バージョン
    (constructor) コンストラクタ C++23
    begin 先頭を指すイテレータを取得する C++23
    end 番兵を取得する C++23
    size 要素数を取得する C++23

    継承しているメンバ関数

    名前 説明 対応バージョン
    empty Rangeが空かどうかを判定する C++20
    operator bool Rangeが空でないかどうかを判定する C++20
    front 先頭要素への参照を取得する C++20
    back 末尾要素への参照を取得する C++20
    cbegin 定数イテレータを取得する C++23
    cend 定数イテレータ(番兵)を取得する C++23
    operator[] 要素へアクセスする C++20

    推論補助

    名前 説明 対応バージョン
    (deduction_guide) クラステンプレートの推論補助 C++23

    #include <ranges>
    #include <vector>
    #include <list>
    #include <unordered_map>
    #include <print>
    
    int main() {
      std::vector v = {1, 2};
      const std::list l = {'a', 'b', 'c'};
    
      std::println("{}", std::views::zip(v, l));
    
      for (auto&& [i, c] : std::views::zip(v, l)) {
        i *= 10; // 要素を書き換えても良い
      }
      std::println("{}", std::views::zip(v, l));
    
      // zipした結果を連想コンテナに変換する
      const auto m = std::views::zip(v, l) | std::ranges::to<std::unordered_map<int, char>>();
      std::println("{}", m);
    
      // 何もzipしていないときは空になる
      std::println("{}", std::views::zip());
    }
    

    出力

    [(1, 'a'), (2, 'b')]
    [(10, 'a'), (20, 'b')]
    {20: 'b', 10: 'a'}
    []
    

    バージョン

    言語

    • C++23

    処理系

    関連項目

    参照