Namespaces
Variants

std:: distance

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 >

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 에서 도달 가능한 경우에 대한 문구가 불명확했음 명확하게 수정됨

참고 항목

주어진 거리만큼 반복자를 전진시킴
(function template)
특정 조건을 만족하는 요소의 개수를 반환함
(function template)
반복자와 센티넬 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환함
(algorithm function object)