std:: advance
| Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<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)
|
반복자를 감소시킴
(함수 템플릿) |
|
두 반복자 사이의 거리를 반환함
(함수 템플릿) |
|
|
(C++20)
|
주어진 거리만큼 또는 주어진 경계까지 반복자를 전진시킴
(알고리즘 함수 객체) |