std::prev
出自cppreference.com
| 在標頭 <iterator> 定義
|
||
| (C++11 起) (C++17 前) |
||
| (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) |
自減迭代器給定的距離或到邊界 (算法函數對象) |