std::ranges:: prev
|
ヘッダーで定義
<iterator>
|
||
|
呼び出しシグネチャ
|
||
|
template
<
std::
bidirectional_iterator
I
>
constexpr I prev ( I i ) ; |
(1) | (C++20以降) |
|
template
<
std::
bidirectional_iterator
I
>
constexpr I prev ( I i, std:: iter_difference_t < I > n ) ; |
(2) | (C++20以降) |
|
template
<
std::
bidirectional_iterator
I
>
constexpr I prev ( I i, std:: iter_difference_t < I > n, I bound ) ; |
(3) | (C++20以降) |
n th 番目の前駆イテレータを返す i 。
このページで説明されている関数ライクな実体は、 アルゴリズム関数オブジェクト (非公式には niebloids として知られる) です。つまり:
- 明示的なテンプレート引数リストは、いずれかを呼び出す際に指定することはできません。
- いずれも 実引数依存の名前探索 では可視になりません。
- いずれかが関数呼び出し演算子の左側の名前として 通常の非修飾名前探索 によって見つかった場合、 実引数依存の名前探索 は抑制されます。
目次 |
パラメータ
| i | - | イテレータ |
| n | - | 要素数 i が降下すべき回数 |
| bound | - | i が指す範囲の先頭を示すイテレータ |
戻り値
計算量
実装例
struct prev_fn { template<std::bidirectional_iterator I> constexpr I operator()(I i) const { --i; return i; } template<std::bidirectional_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n) const { ranges::advance(i, -n); return i; } template<std::bidirectional_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n, I bound) const { ranges::advance(i, -n, bound); return i; } }; inline constexpr auto prev = prev_fn(); |
注記
式
--
r.
end
(
)
はコンテナに対してコンパイルが通ることが多いものの、保証されているわけではありません:
r.
end
(
)
は右辺値式であり、右辺値のデクリメントが動作することが保証されていることを規定するイテレータ要件は存在しません。特に、イテレータがポインタとして実装されている場合や、
operator--
が左辺値参照修飾されている場合、
--
r.
end
(
)
はコンパイルできませんが、
ranges
::
prev
(
r.
end
(
)
)
はコンパイルできます。
これはさらに、
ranges::
common_range
をモデル化しない範囲によって悪化します。例えば、一部の基盤となる範囲では、
ranges
::
transform_view
::
end
の戻り値型が
ranges
::
transform_view
::
begin
と同じではないため、
--
r.
end
(
)
はコンパイルされません。これは
ranges::prev
が支援できるものではありませんが、回避策は存在します。
例
#include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> v{3, 1, 4}; auto pv = std::ranges::prev(v.end(), 2); std::cout << *pv << '\n'; pv = std::ranges::prev(pv, 42, v.begin()); std::cout << *pv << '\n'; }
出力:
1 3
関連項目
|
(C++20)
|
指定された距離または境界までイテレータをインクリメントする
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
指定された距離または指定された境界までイテレータを進める
(アルゴリズム関数オブジェクト) |
|
(C++11)
|
イテレータをデクリメントする
(関数テンプレート) |