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

履歴 編集

function template
<algorithm>

std::ranges::in_out_out_result(C++20)

namespace std::ranges {
  // (1)
  template<class I, class O1, class O2>
  struct in_out_out_result {
    [[no_unique_address]] I  in;
    [[no_unique_address]] O1 out1;
    [[no_unique_address]] O2 out2;

    template<class II, class OO1, class OO2>
      requires convertible_to<const I&, II> &&
               convertible_to<const O1&, OO1> &&
               convertible_to<const O2&, OO2>
    constexpr operator in_out_out_result<II, OO1, OO2>() const & {
      return {in, out1, out2};
    }

    template<class II, class OO1, class OO2>
      requires convertible_to<I, II> &&
               convertible_to<O1, OO1> &&
               convertible_to<O2, OO2>
    constexpr operator in_out_out_result<II, OO1, OO2>() && {
      return {std::move(in), std::move(out1), std::move(out2)};
    }
  };

  // (2)
  template<class I, class O1, class O2>
  using partition_copy_result = in_out_out_result<I, O1, O2>;
}

概要

この型は、関数が入力用の範囲と2つの出力用の範囲を受け取る場合に、それぞれ処理した範囲の末尾を返すために使用される。

標準アルゴリズム関数ではこの型を直接返す代わりに、関数毎にエイリアスを定義している。

メンバ変数

名前 説明 対応バージョン
[[no_unique_address]] I in 処理した範囲の末尾 C++20
[[no_unique_address]] O1 out1 1つめの出力した範囲の末尾 C++20
[[no_unique_address]] O2 out2 2つめの出力した範囲の末尾 C++20

メンバ関数

名前 説明 対応バージョン
operator in_out_out_result<II, OO1, OO2> 変換演算子 C++20

変換演算子は、各テンプレートパラメーターが変換できる場合のみオーバーロード解決に参加する。

#include <cassert>
#include <vector>
#include <algorithm>

bool is_even(int x) { return x % 2 == 0; }

int main()
{
  std::vector<int> v = {1, 2, 3, 4, 5};

  // 偶数グループと奇数グループに分ける
  std::vector<int> evens(5);
  std::vector<int> odds(5);
  const std::ranges::in_out_out_result result = std::ranges::partition_copy(v, evens.begin(), odds.begin(), is_even);

  assert(result.in == v.end());
  assert(result.out1 == evens.begin() + 2);
  assert(result.out2 == odds.begin() + 3);

  // 出力した範囲の後ろを削除する
  evens.erase(result.out1, evens.end());
  odds.erase(result.out2, odds.end());

  assert(evens.size() == 2);
  assert(odds.size() == 3);
}

出力

バージョン

言語

  • C++20

処理系

参照