名稱空間
變體
操作

std::prev

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器介面卡
迭代器操作
prev
(C++11)  
(C++11)
範圍訪問
(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 起)

返回迭代器 it 的第 n 個前驅(如果 n 為負,則是第 -n 個後繼)。

目錄

[編輯] 引數

it - 一個迭代器
n - it 應回退的元素數量
型別要求
-
BidirIt 必須滿足 LegacyBidirectionalIterator 的要求。

[編輯] 返回值

型別為 BidirIt 的迭代器,它是迭代器 it 的第 n 個前驅(如果 n 為負,則是第 -n 個後繼)。

[編輯] 複雜度

線性。

然而,如果 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-- 是左值引用限定時,--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)
遞增迭代器
(函式模板) [編輯]
按給定距離前進迭代器
(函式模板) [編輯]
返回兩個迭代器間的距離
(函式模板) [編輯]
按給定距離或到邊界遞減迭代器
(演算法函式物件)[編輯]