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

履歴 編集

class template
<ranges>

std::ranges::join_with_view(C++23)

namespace std::ranges {
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>>
          && view<Pattern>
          && compatible-joinable-ranges<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>> { …… }; // (1)

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

概要

join_with_viewは要素がRangeであるRangeの各要素を繋げて1つのRangeとして扱うview。 その際、join_viewと異なり、外側のRangeの各要素の間にデリミタを挿入する。 デリミタは単一の要素またはRangeである。デリミタがRangeの場合、外側のRangeの各要素の間にデリミタの各要素が毎回挿入される。

  • (1): join_with_viewのクラス定義
  • (2): join_with_viewを生成するRangeアダプタオブジェクト

Rangeコンセプト

borrowed sized output input forward bidirectional random_access contiguous common viewable view
(1) (2) (3)
  • (1): 外側・内側のRangeがforward_rangeであり、内側Rangeが参照型のとき
  • (2): 外側・内側のRangeがbidirectional_rangeであり、内側Rangeが参照型かつcommon_rangeであるとき
  • (3): 外側・内側のRangeがforward_rangeかつcommon_rangeであり
    • constではない場合、内側のRangeは参照型(prvalueではない)

外側RangeとはVのことであり、内側Rangeとはrange_reference_t<V>のことである。constの場合Vconst Vとして同様。

効果

  • (2): 式views::join_with(E, F)の効果はjoin_with_view{E, F}と等しい。

備考

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

namespace std::ranges {
  template<class R, class P>
  concept compatible-joinable-ranges =            // 説明専用
      common_with<range_value_t<R>, range_value_t<P>> &&
      common_reference_with<range_reference_t<R>, range_reference_t<P>> &&
      common_reference_with<range_reference_t<R>, range_rvalue_reference_t<P>>;

  template<class R>
  concept bidirectional-common = bidirectional_range<R> && common_range<R>;    // 説明専用
}

メンバ関数

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

継承しているメンバ関数

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

推論補助

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

#include <ranges>
#include <vector>
#include <string>
#include <print>

int main() {
  using namespace std;
  vector<string> sv = {"hello", "world"};

  for (char c : sv | views::join_with('-')) {
    println("{}", c);
  }
}

出力

h
e
l
l
o
-
w
o
r
l
d

ネストされた char のRangeが平坦な char のRangeになっている。

例 (結果を文字列にする)

#include <ranges>
#include <vector>
#include <string>
#include <print>

int main() {
  using namespace std;
  vector<string> sv = {"hello", "world"};

  println("{}", sv | views::join_with("-C++23-"sv) | ranges::to<string>());
}

出力

hello-C++23-world

join_withで得られる char のRangeはstringではないが、ranges::toを使って変換できる。

バージョン

言語

  • C++23

処理系

関連項目

参照