Namespaces
Variants

std:: advance

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 < class InputIt, class Distance >
void advance ( InputIt & it, Distance n ) ;
(C++17까지)
template < class InputIt, class Distance >
constexpr void advance ( InputIt & it, Distance n ) ;
(C++17부터)

주어진 반복자 it n 개의 요소만큼 증가시킵니다.

만약 n 이 음수이면, 반복자는 감소합니다. 이 경우 InputIt LegacyBidirectionalIterator 요구 사항을 충족해야 하며, 그렇지 않으면 동작이 정의되지 않습니다.

목차

매개변수

it - 앞으로 이동할 반복자
n - it 이 앞으로 이동해야 할 요소의 개수
타입 요구사항
-
InputIt LegacyInputIterator 요구사항을 충족해야 합니다.

반환값

(없음)

복잡도

선형.

그러나 InputIt 가 추가적으로 LegacyRandomAccessIterator 요구사항을 충족하는 경우, 복잡도는 상수입니다.

참고 사항

지정된 증분 또는 감분 시퀀스가 증분 불가능한 반복자(예: past-the-end 반복자)를 증분하거나, 감분 불가능한 반복자(예: front 반복자 또는 singular 반복자)를 감분해야 하는 경우 동작은 정의되지 않습니다.

가능한 구현

다음 구현도 참조하십시오: libstdc++ libc++ .


비 constexpr 버전
namespace detail
{
    template<class It>
    void do_advance(It& it, typename std::iterator_traits<It>::difference_type n,
                    std::input_iterator_tag)
    {
        while (n > 0)
        {
            --n;
            ++it;
        }
    }
    template<class It>
    void do_advance(It& it, typename std::iterator_traits<It>::difference_type n,
                    std::bidirectional_iterator_tag)
    {
        while (n > 0)
        {
            --n;
            ++it;
        }
        while (n < 0)
        {
            ++n;
            --it;
        }
    }
    template<class It>
    void do_advance(It& it, typename std::iterator_traits<It>::difference_type n,
                    std::random_access_iterator_tag)
    {
        it += n;
    }
} // namespace detail
template<class It, class Distance>
void advance(It& it, Distance n)
{
    detail::do_advance(it, typename std::iterator_traits<It>::difference_type(n),
                       typename std::iterator_traits<It>::iterator_category());
}
constexpr 버전
template<class It, class Distance>
constexpr void advance(It& it, Distance n)
{
    using category = typename std::iterator_traits<It>::iterator_category;
    static_assert(std::is_base_of_v<std::input_iterator_tag, category>);
    auto dist = typename std::iterator_traits<It>::difference_type(n);
    if constexpr (std::is_base_of_v<std::random_access_iterator_tag, category>)
        it += dist;
    else
    {
        while (dist > 0)
        {
            --dist;
            ++it;
        }
        if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, category>)
            while (dist < 0)
            {
                ++dist;
                --it;
            }
    }
}

예제

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

출력:

4 1

참고 항목

(C++11)
반복자를 증가시킴
(함수 템플릿)
(C++11)
반복자를 감소시킴
(함수 템플릿)
두 반복자 사이의 거리를 반환함
(함수 템플릿)
주어진 거리만큼 또는 주어진 경계까지 반복자를 전진시킴
(알고리즘 함수 객체)