std::prev
From cppreference.com
| ヘッダ <iterator> で定義 |
||
template< class BidirIt > BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 ); |
(C++11以降) (C++17まで) |
|
| template< class BidirIt > constexpr |
(C++17以降) | |
イテレータ it の n 番目の前身(n が負の場合は -n 番目の後継)を返します。
目次 |
[編集] パラメータ
| it | - | イテレータ |
| n | - | it が逆方向に移動する要素の数。 |
| 型要件 | ||
-BidirIt は LegacyBidirectionalIterator の要件を満たしている必要があります。 | ||
[編集] 戻り値
イテレータ it の n 番目の前身(n が負の場合は -n 番目の後継)を保持する BidirIt 型のイテレータ。
[編集] 計算量
線形。
ただし、BidirIt がさらに LegacyRandomAccessIterator の要件を満たしている場合、計算量は定数です。
[編集] 可能な実装
template<class BidirIt> constexpr // since C++17 BidirIt prev(BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1) { std::advance(it, -n); return it; } |
[編集] 注記
--c.end() という式はコンパイルされることが多いですが、それが保証されているわけではありません。c.end() は右辺値式であり、右辺値のデクリメントが機能することを指定するイテレータ要件はありません。特に、イテレータがポインタとして実装されている場合や、その operator-- がlvalue-ref-qualifiedである場合、--c.end() はコンパイルされませんが、std::prev(c.end()) はコンパイルされます。
[編集] 例
このコードを実行
#include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> v{3, 1, 4}; auto it = v.end(); auto pv = std::prev(it, 2); std::cout << *pv << '\n'; it = v.begin(); pv = std::prev(it, -2); std::cout << *pv << '\n'; }
出力
1 4
[編集] 関連項目
| (C++11) |
イテレータをインクリメントする (関数テンプレート) |
| イテレータを指定された距離だけ進める (関数テンプレート) | |
| 2つのイテレータ間の距離を返す (関数テンプレート) | |
| (C++20) |
イテレータを指定された距離または境界までデクリメントする (アルゴリズム関数オブジェクト) |