std::prev

出自cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
算法概念與工具
間接可調用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器適配器
範圍訪問
(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)
令迭代器自增
(函數模板) [編輯]
令迭代器前進給定的距離
(函數模板) [編輯]
返回兩個迭代器間的距離
(函數模板) [編輯]
自減迭代器給定的距離或到邊界
(算法函數對象) [編輯]