• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <iterator>

    std::ranges::prev

    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までイテレータを進める

    参照