| | |
template<class BidirIt> BidirIt prev( BidirIt it,typenamestd::iterator_traits<BidirIt>::difference_type n=1); | | (since C++11) (until C++17) |
template<class BidirIt>
constexpr
BidirIt prev( BidirIt it,typenamestd::iterator_traits<BidirIt>::difference_type n=1); | | (since C++17) |
| | |
Return thenth predecessor (or-nth successor ifn is negative) of iteratorit.
[edit]Parameters
it | - | an iterator |
n | - | number of elementsit should be descended |
Type requirements |
-BidirIt must meet the requirements ofLegacyBidirectionalIterator. |
[edit]Return value
An iterator of typeBidirIt
that holds thenth predecessor (or-nth successor ifn is negative) of iteratorit.
[edit]Complexity
Linear.
However, ifBidirIt
additionally meets the requirements ofLegacyRandomAccessIterator, complexity is constant.
[edit]Possible implementation
template<class BidirIt>constexpr// since C++17BidirIt prev(BidirIt it,typenamestd::iterator_traits<BidirIt>::difference_type n=1){std::advance(it,-n);return it;} |
Although the expression--c.end() often compiles, it is not guaranteed to do so:c.end() is an rvalue expression, and there is no iterator requirement that specifies that decrement of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers or itsoperator-- is lvalue-ref-qualified,--c.end() does not compile, whilestd::prev(c.end()) does.
[edit]Example
#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';}
Output:
[edit]See also
| increment an iterator (function template)[edit] |
| advances an iterator by given distance (function template)[edit] |
| returns the distance between two iterators (function template)[edit] |
| decrement an iterator by a given distance or to a bound (algorithm function object)[edit] |