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

履歴 編集

function template
<algorithm>

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

namespace std::ranges {
  // (1)
  template<class I1, class I2>
  struct in_in_result {
    [[no_unique_address]] I1 in1;
    [[no_unique_address]] I2 in2;

    template<class II1, class II2>
      requires convertible_to<const I1&, II1> && convertible_to<const I2&, II2>
    constexpr operator in_in_result<II1, II2>() const & {
      return {in1, in2};
    }

    template<class II1, class II2>
      requires convertible_to<I1, II1> && convertible_to<I2, II2>
    constexpr operator in_in_result<II1, II2>() && {
      return {std::move(in1), std::move(in2)};
    }
  };

  // (2)
  template<class I1, class I2>
  using mismatch_result = in_in_result<I1, I2>;

  // (3)
  template<class I1, class I2>
  using swap_ranges_result = in_in_result<I1, I2>;
}

概要

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

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

メンバ変数

名前 説明 対応バージョン
[[no_unique_address]] I1 in1 1つめの処理した範囲の末尾 C++20
[[no_unique_address]] I2 in2 2つめの処理した範囲の末尾 C++20

メンバ関数

名前 説明 対応バージョン
operator in_in_result<II1, II22> 変換演算子 C++20

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

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

int main() {
  const std::vector<int>   v  = { 1,2,3,4,3,2 };
  const std::array<int, 6> v2 = { 1,2,4,3,2,1 };

  // v と v2 で異なる場所を探す
  const std::ranges::in_in_result result = std::ranges::mismatch(v, v2);

  assert(result.in1 == v.begin() + 2);
  assert(result.in2 == v2.begin() + 2);
}

出力

バージョン

言語

  • C++20

処理系

参照