std:: distance
|
헤더에 정의됨
<iterator>
|
||
|
template
<
class
InputIt
>
typename
std::
iterator_traits
<
InputIt
>
::
difference_type
|
(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) |
|
|
(C++20)
|
반복자와 센티넬 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환함
(algorithm function object) |