[ Web Proxy ]
URL:
Viewing: https://en.cppreference.com/cpp/iterator/prev [Back]  [Original]

std::prev - cppreference.com
cppreference.com
Namespaces
Variants

std::prev

From cppreference.com
 
 
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Defined in header <iterator>
template< class BidirIt >
BidirIt prev( BidirIt iter, typename std::iterator_traits
                                         <BidirIt>::difference_type count = 1 );
(since C++11)
(constexpr since C++17)

Return the countth predecessor (or -countth successor if count is negative) of iterator iter.

Parameters

iter - an iterator
count - the number of steps to be descend
Type requirements
-
BidirIt must meet the requirements of LegacyBidirectionalIterator.

Return value

As described above.

Complexity

Linear in count.

However, if BidirIt additionally meets the requirements of LegacyRandomAccessIterator, complexity is constant.

Possible implementation

template<class BidirIt>
constexpr // since C++17
BidirIt prev(BidirIt iter,
             typename std::iterator_traits<BidirIt>::difference_type count = 1)
{
    std::advance(iter, -count);
    return iter;
}

Notes

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 its operator-- is lvalue-ref-qualified, --c.end() does not compile, while std::prev(c.end()) does.

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:

1
4

See also

decrement an iterator by a given distance or to a bound
(algorithm function object)[edit]
(C++11)
increment an iterator
(function template) [edit]
advances an iterator by given distance
(function template) [edit]
returns the distance between two iterators
(function template) [edit]

Web Proxy Viewer  |  New URL  |  Original Page