std::prev
來自 cppreference.com
< cpp | 迭代器 (iterator)
定義於標頭檔案 <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 的要求。 |
[編輯] 返回值
型別為 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) |
遞增迭代器 (函式模板) |
按給定距離前進迭代器 (函式模板) | |
返回兩個迭代器間的距離 (函式模板) | |
(C++20) |
按給定距離或到邊界遞減迭代器 (演算法函式物件) |