Skip to content

Latest commit

 

History

History
111 lines (85 loc) · 3.49 KB

op_equal.md

File metadata and controls

111 lines (85 loc) · 3.49 KB

operator==

  • iterator[meta header]
  • std[meta namespace]
  • common_iterator[meta class]
  • function[meta id-type]
  • cpp20[meta cpp]
namespace std {
  template<input_or_output_iterator I, sentinel_for<I> S>
  class common_iterator {

    template<class I2, sentinel_for<I> S2>
      requires sentinel_for<S, I2>
    friend bool operator==(const common_iterator& x, const common_iterator<I2, S2>& y);   // (1)

    template<class I2, sentinel_for<I> S2>
      requires sentinel_for<S, I2> && equality_comparable_with<I, I2>
    friend bool operator==(const common_iterator& x, const common_iterator<I2, S2>& y);   // (2)
  };
}
  • input_or_output_iterator[link /reference/iterator/input_or_output_iterator.md]
  • sentinel_for[link /reference/iterator/sentinel_for.md]
  • equality_comparable_with[link /reference/concepts/equality_comparable.md]

概要

2つのcommon_iteratorオブジェクトが同じ要素を指しているかを判定する。

事前条件

x.v_.valueless_by_exception()y.v_.valueless_by_exception()はどちらもfalseであること。

戻り値

I, SI2, S2)の値のどちらかをvariant<I, S>型のメンバ変数v_に保持しており、i = x.v_.index()j = y.v_.index()として

  • (1)
    • i == jの場合 : true
    • それ以外の場合 : get<i>(x.v_) == get<j>(y.v_)
  • (2)
    • i, jがどちらも1の場合 : true
    • それ以外の場合 : get<i>(x.v_) == get<j>(y.v_)

備考

C++20以降、これらの演算子により以下の演算子が使用可能になる(制約は使用する==に準ずる)。

template<class I2, sentinel_for<I> S2>
friend bool operator==(const common_iterator<I2, S2>& y, const common_iterator& x);

template<class I2, sentinel_for<I> S2>
friend bool operator!=(const common_iterator& x, const common_iterator<I2, S2>& y);

template<class I2, sentinel_for<I> S2>
friend bool operator!=(const common_iterator<I2, S2>& y, const common_iterator& x);

#include <iostream>
#include <iterator>
#include <ranges>

int main() {
  auto seq = std::views::iota(1) | std::views::take(5);

  // common_iteratorを通すことでイテレータ型と番兵型を合わせる
  using CI = std::common_iterator<std::ranges::iterator_t<decltype(seq)>, std::ranges::sentinel_t<decltype(seq)>>;

  CI ci{std::ranges::begin(seq)};
  CI ce{std::ranges::end(seq)};
  auto ci2 = ci++;
  
  std::cout << std::boolalpha;
  
  std::cout << (ci == ci2) << std::endl;
  std::cout << (ci == ce) << std::endl;

  // ==から導出される!=
  std::cout << (ci != ci2) << std::endl;
  std::cout << (ci != ce) << std::endl;
}
  • views::iota[link /reference/ranges/iota_view.md]
  • views::take[link /reference/ranges/take_view.md]
  • iterator_t[link /reference/ranges/iterator_t.md]
  • sentinel_t[link /reference/ranges/sentinel_t.md]
  • ranges::begin[link /reference/ranges/begin.md]

出力

false
false
true
true

バージョン

言語

  • C++20

処理系

参照