Skip to content

Latest commit

 

History

History
144 lines (111 loc) · 5.78 KB

zip_view.md

File metadata and controls

144 lines (111 loc) · 5.78 KB

zip_view

  • ranges[meta header]
  • std::ranges[meta namespace]
  • class template[meta id-type]
  • cpp23[meta cpp]
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のサイズはそれらの中で最小のサイズとなる。

  • (1): zip_viewのクラス定義
  • (2): zip_viewを生成するカスタマイゼーションポイントオブジェクト(Rangeアダプタオブジェクトではない)

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());
}
  • std::views::zip[color ff0000]
  • std::ranges::to[link to.md]

出力

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

バージョン

言語

  • C++23

処理系

関連項目

参照