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

履歴 編集

class template
<ranges>

std::ranges::concat_view(C++26)

namespace std::ranges {
  template<input_range... Views>
  requires (view<Views> && ...) && (sizeof...(Views) > 0) && concatable<Views...>
  class concat_view : public view_interface<concat_view<Views...>> {…… }; // (1)

  namespace views {
    inline constexpr /*unspecified*/ concat = /*unspecified*/;      // (2)
  }
}

概要

concat_viewは複数のRangeを連結し、1つのRangeとするview

Rangeコンセプト

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

テンプレートパラメータ制約

連結するすべてのビューに対して、

  • それらの要素に共通の値型Cv、参照型Cr、右辺値参照型Crr が存在し、
  • Cr&&Cv&Cr&&Crr&&Crr&&Cv const&にそれぞれ共通の参照型があり、
  • 連結するすべてのビューのイテレーターitについて、
    • *itCrに変換可能であり、
    • ranges::iter_move(it)Crrに変換可能であること。

効果

  • (2): 式views::concat(Es...)の効果は次の通り
    • Es...が1要素で、その型が input_rangeのモデルであるとき、views::all(Es...) と等しい
    • それ以外のとき、concat_view(Es...) と等しい

備考

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

namespace std::ranges {
  template<class... Rs>
  using concat-reference-t = common_reference_t<range_reference_t<Rs>...>;

  template<class... Rs>
  using concat-value-t = common_type_t<range_value_t<Rs>...>;

  template<class... Rs>
  using concat-rvalue-reference-t = common_reference_t<range_rvalue_reference_t<Rs>...>;

  template<class Ref, class RRef, class It>
  concept concat-indirectly-readable-impl =
    requires (const It it) {
      { *it } -> convertible_to<Ref>;
      { ranges::iter_move(it) } -> convertible_to<RRef>;
    };

  template<class... Rs>
  concept concat-indirectly-readable =
    common_reference_with<concat-reference-t<Rs...>&&, concat-value-t<Rs...>&> &&
    common_reference_with<concat-reference-t<Rs...>&&, concat-rvalue-reference-t<Rs...>&&> &&
    common_reference_with<concat-rvalue-reference-t<Rs...>&&, concat-value-t<Rs...> const&> &&
    (concat-indirectly-readable-impl<concat-reference-t<Rs...>, concat-rvalue-reference-t<Rs...>, iterator_t<Rs>> && ...);

  template<class... Rs>
  concept concatable = requires {
    typename concat-reference-t<Rs...>;
    typename concat-value-t<Rs...>;
    typename concat-rvalue-reference-t<Rs...>;
  } && concat-indirectly-readable<Rs...>;

  // Fs を Rs の末尾を除いたパックとする

  template<bool Const, class... Rs>
  concept concat-is-random-access =
    all-random-access<Const, Rs...> &&
    (common_range<maybe-const<Const, Fs>> && ...);

  template<bool Const, class... Rs>
  concept concat-is-bidirectional =
    all-bidirectional<Const, Rs...> &&
    (common_range<maybe-const<Const, Fs>> && ...);
}

メンバ関数

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

継承しているメンバ関数

名前 説明 対応バージョン
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

import std;

int main() {
  std::vector<int> v1{1, 2, 3}, v2{4, 5}, v3{};
  std::array a{6, 7, 8};
  auto s = std::views::single(9);
  std::print("{} ", std::views::concat(v1, v2, v3, a, s));
}

出力

[1, 2, 3, 4, 5, 6, 7, 8, 9]

バージョン

言語

  • C++26

処理系

参照