Namespaces
Variants

std:: distance

From ko.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 >

typename std:: iterator_traits < InputIt > :: difference_type

distance ( InputIt first, InputIt last ) ;
(C++17부터 constexpr)

first 에서 last 까지의 홉 수를 반환합니다.

만약 InputIt 이 LegacyRandomAccessIterator 가 아닌 경우, last 가 first 로부터 도달 가능 하지 않으면 동작은 정의되지 않습니다.

만약 InputIt 이 LegacyRandomAccessIterator 인 경우, first 와 last 가 서로 도달 가능하지 않으면 동작은 정의되지 않습니다.

내용

매개변수

first - 첫 번째 요소를 가리키는 반복자
last - 범위의 끝을 가리키는 반복자
타입 요구사항
-
InputIt 는 LegacyInputIterator 요구사항을 충족해야 합니다. InputIt 가 추가로 LegacyRandomAccessIterator 요구사항을 충족할 경우 연산이 더 효율적입니다.

반환값

first 에서 last 까지 이동하는 데 필요한 증분 횟수.

랜덤 액세스 반복자가 사용되고 first 가 last 에 도달 가능한 경우 값은 음수일 수 있습니다.

(since C++11)

복잡도

선형.

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

가능한 구현

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

C++98 태그 디스패치 구현, constexpr 제거된 버전
namespace detail
{
    template<class It>
    constexpr // required since C++17
    typename std::iterator_traits<It>::difference_type 
        do_distance(It first, It last, std::input_iterator_tag)
    {
        typename std::iterator_traits<It>::difference_type result = 0;
        while (first != last)
        {
            ++first;
            ++result;
        }
        return result;
    }
    template<class It>
    constexpr // required since C++17
    typename std::iterator_traits<It>::difference_type 
        do_distance(It first, It last, std::random_access_iterator_tag)
    {
        return last - first;
    }
} // namespace detail
template<class It>
constexpr // since C++17
typename std::iterator_traits<It>::difference_type 
    distance(It first, It last)
{
    return detail::do_distance(first, last,
                               typename std::iterator_traits<It>::iterator_category());
}
C++17 if constexpr 구현
template<class It>
constexpr typename std::iterator_traits<It>::difference_type
    distance(It first, It last)
{
    using category = typename std::iterator_traits<It>::iterator_category;
    static_assert(std::is_base_of_v<std::input_iterator_tag, category>);
    if constexpr (std::is_base_of_v<std::random_access_iterator_tag, category>)
        return last - first;
    else
    {
        typename std::iterator_traits<It>::difference_type result = 0;
        while (first != last)
        {
            ++first;
            ++result;
        }
        return result;
    }
}

예제

#include <iostream>
#include <iterator>
#include <vector>
int main() 
{
    std::vector<int> v{3, 1, 4};
    std::cout << "distance(first, last) = "
              << std::distance(v.begin(), v.end()) << '\n'
              << "distance(last, first) = "
              << std::distance(v.end(), v.begin()) << '\n';
              // the behavior is undefined (until LWG940)
    static constexpr auto il = {3, 1, 4};
    // Since C++17 `distance` can be used in constexpr context.
    static_assert(std::distance(il.begin(), il.end()) == 3);
    static_assert(std::distance(il.end(), il.begin()) == -3);
}

출력:

distance(first, last) = 3
distance(last, first) = -3

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 940 C++98 first 가 last 에서 도달 가능한 경우에 대한 문구가 불명확했음 명확하게 수정됨

같이 보기

반복자를 주어진 거리만큼 전진시킵니다
(함수 템플릿)
특정 조건을 만족하는 요소의 개수를 반환합니다
(함수 템플릿 & 알고리즘 함수 객체)
반복자와 센티널 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환합니다
(알고리즘 함수 객체)