名前空間
変種
操作

std::prev

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <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

BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );
(C++17以降)

イテレータ itn 番目の前身(n が負の場合は -n 番目の後継)を返します。

目次

[編集] パラメータ

it - イテレータ
n - it が逆方向に移動する要素の数。
型要件
-
BidirItLegacyBidirectionalIterator の要件を満たしている必要があります。

[編集] 戻り値

イテレータ itn 番目の前身(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つのイテレータ間の距離を返す
(関数テンプレート) [編集]
イテレータを指定された距離または境界までデクリメントする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)