Namespaces
Variants

std::ranges:: prev

From cppreference.net
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)
헤더에 정의됨 <iterator>
호출 시그니처
template < std:: bidirectional_iterator I >
constexpr I prev ( I i ) ;
(1) (C++20부터)
template < std:: bidirectional_iterator I >
constexpr I prev ( I i, std:: iter_difference_t < I > n ) ;
(2) (C++20부터)
template < std:: bidirectional_iterator I >
constexpr I prev ( I i, std:: iter_difference_t < I > n, I bound ) ;
(3) (C++20부터)

반복자 i n 번째 선행자를 반환합니다.

이 페이지에서 설명하는 함수형 개체들은 algorithm function objects (일반적으로 niebloids 로 알려진) 즉:

목차

매개변수

i - 반복자
n - 요소 개수 i 가 하강해야 하는
bound - i 가 가리키는 범위의 시작을 나타내는 반복자

반환값

1) i 의 선행자.
2) 반복자 i n 번째 선행자.
3) 반복자 i n 번째 선행자 또는 bound 와 비교하여 동일한 첫 번째 반복자 중 먼저 도달하는 것.

복잡도

1) 상수.
2,3) I std:: random_access_iterator < I > 를 모델링하면 상수 시간; 그렇지 않으면 선형 시간.

가능한 구현

struct prev_fn
{
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i) const
    {
        --i;
        return i;
    }
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i, std::iter_difference_t<I> n) const
    {
        ranges::advance(i, -n);
        return i;
    }
    template<std::bidirectional_iterator I>
    constexpr I operator()(I i, std::iter_difference_t<I> n, I bound) const
    {
        ranges::advance(i, -n, bound);
        return i;
    }
};
inline constexpr auto prev = prev_fn();

참고 사항

표현식 -- r. end ( ) 가 컨테이너에 대해 컴파일되는 경우가 많지만, 이것이 보장되지는 않습니다: r. end ( ) 는 rvalue 표현식이며, rvalue의 감소가 작동한다고 보장하는 반복자 요구 사항은 존재하지 않습니다. 특히 반복자가 포인터로 구현되거나 operator-- 가 lvalue-ref-qualified인 경우, -- r. end ( ) 는 컴파일되지 않는 반면 ranges :: prev ( r. end ( ) ) 는 컴파일됩니다.

이 문제는 ranges:: common_range 을 모델링하지 않는 범위에서 더욱 악화됩니다. 예를 들어, 일부 기본 범위의 경우 ranges :: transform_view :: end 의 반환 타입이 ranges :: transform_view :: begin 과 동일하지 않아 -- r. end ( ) 가 컴파일되지 않을 수 있습니다. 이는 ranges::prev 가 해결할 수 없는 문제이지만, 해결 방법이 존재합니다.

예제

#include <iostream>
#include <iterator>
#include <vector>
int main() 
{
    std::vector<int> v{3, 1, 4};
    auto pv = std::ranges::prev(v.end(), 2);
    std::cout << *pv << '\n';
    pv = std::ranges::prev(pv, 42, v.begin());
    std::cout << *pv << '\n';
}

출력:

1
3

참고 항목

주어진 거리만큼 또는 경계까지 반복자를 증가시킴
(algorithm function object)
주어진 거리만큼 또는 주어진 경계까지 반복자를 전진시킴
(algorithm function object)
(C++11)
반복자를 감소시킴
(function template)