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) :
x
をn
戻したイテレータのコピーを返す - (3) :
x
をbound
以内で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
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 5 ✅
関連項目
名前 | 説明 |
---|---|
next() |
n 回前方に進めたイテレータを返す |
prev() |
n 回後方に進めたイテレータを返す |
advance() |
n 回イテレータを進める |
ranges::next() |
n 回あるいはbound まで前方に進めたイテレータを返す |
ranges::advance() |
n 回あるいはbound までイテレータを進める |