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

履歴 編集

function template
<iterator>

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

namespace std::ranges {
  template<bidirectional_iterator I>
  constexpr I prev(I x);                                    // (1)

  template<bidirectional_iterator I>
  constexpr I prev(I x, iter_difference_t<I> n);            // (2)

  template<bidirectional_iterator I>
  constexpr I prev(I x, iter_difference_t<I> n, I bound);   // (3)
}

概要

n回あるいは指定された位置まで戻したイテレータを返す。

ranges::advance()と違い、引数として渡されたイテレータへの参照を書き換えるのではなく、n回戻したイテレータのコピーを返す。

引数

  • x -- 進行の出発位置を示すイテレータ
  • n -- 進める距離
  • bound -- 進行の目的地となる位置を示すイテレータ(あるいは番兵)

効果

  • (1) : 以下と等価

    --x;
    return x;
    

  • (2) : 以下と等価

    ranges::advance(x, -n);
    return x;
    

  • (3) : 以下と等価

    ranges::advance(x, -n, bound);
    return x;
    

戻り値

  • (1) : xを1戻したイテレータのコピーを返す
  • (2) : xn戻したイテレータのコピーを返す
  • (3) : xbound以内でn戻したイテレータのコピーを返す

備考

この関数テンプレートは通常の名前探索で発見されている場合にADLを無効化する。詳しくは「ADLを無効にする関数定義」を参照のこと。

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

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

  auto it = std::end(vec);

  // (1)、1つ戻る
  auto pos10 = std::ranges::prev(it);
  std::cout << *pos10 << std::endl;

  // (2)、3戻る
  auto pos8 = std::ranges::prev(it, 3);
  std::cout << *pos8 << std::endl;

  // (2)、-2進める
  auto pos10_2 = std::ranges::prev(pos8, -2);
  std::cout << *pos10_2 << std::endl;


  auto bound = std::ranges::prev(it, 5); // 6の位置

  // (3)、boundまでの間で、8戻る
  auto pos6 = std::ranges::prev(it, 8, bound);
  std::cout << *pos6 << std::endl;

  // (3)、boundまでの間で、4戻る
  auto pos7 = std::ranges::prev(it, 4, bound);
  std::cout << *pos7 << std::endl;
}

出力

10
8
10
6
7

バージョン

言語

  • C++20

処理系

関連項目

名前 説明
next() n回前方に進めたイテレータを返す
prev() n回後方に進めたイテレータを返す
advance() n回イテレータを進める
ranges::next() n回あるいはboundまで前方に進めたイテレータを返す
ranges::advance() n回あるいはboundまでイテレータを進める

参照