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

履歴 編集

function
<iterator>

std::common_iterator::operator-(C++20)

namespace std {
  template<input_or_output_iterator I, sentinel_for<I> S>
  class common_iterator {

    template<sized_sentinel_for<I> I2, sized_sentinel_for<I> S2>
      requires sized_sentinel_for<S, I2>
    friend iter_difference_t<I2> operator-(const common_iterator& x, const common_iterator<I2, S2>& y);
  };
}

概要

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()として、次のどちらか。

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

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

int main() {
  std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};

  // common_iteratorを通すことでイテレータ型と番兵型を合わせる
  using CI = std::common_iterator<std::counted_iterator<std::vector<int>::iterator>, std::default_sentinel_t>;

  CI ci{std::counted_iterator{std::ranges::begin(vec), 5}};
  CI ce{std::default_sentinel};
  auto ci2 = ci++;

  // イテレータとイテレータ
  std::cout << (ci - ci2) << std::endl;
  std::cout << (ci2 - ci) << std::endl;

  // イテレータと番兵
  std::cout << (ci - ce) << std::endl;
  std::cout << (ce - ci) << std::endl;
}

出力

1
-1
-4
4

バージョン

言語

  • C++20

処理系

参照