On this page
article
std::advance
개념
std::advance
는 C++ 표준 라이브러리 <iterator>
헤더에 정의된 함수로, 반복자(iterator)를 지정된 거리만큼 이동시키는 데 사용된다. 이 함수는 반복자의 종류에 따라 효율적인 방식으로 이동을 수행하며, 반복자의 타입에 맞는 연산 방식을 자동으로 선택한다.
기본 문법
#include <iterator>
// C++17 이전
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 );
it
: 이동시킬 반복자n
: 이동할 거리 (음수도 가능, 단 양방향 또는 임의 접근 반복자에 한함)
C++17부터 달라진 점
advance
함수가constexpr
로 지정됨 → 컴파일 타임에도 실행 가능- 반복자가
constexpr
컨텍스트에서도 동작할 수 있도록 보장됨
사용 예시
vector (임의 접근 반복자)
std::vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin();
std::advance(it, 3);
std::cout << *it; // 출력: 4
list (양방향 반복자)
std::list<int> lst = {10, 20, 30, 40};
auto it = lst.begin();
std::advance(it, 2);
std::cout << *it; // 출력: 30
반복자 종류에 따른 작동 방식
반복자 종류 | 지원 연산 | std::advance 내부 동작 |
---|---|---|
InputIterator | ++ 만 가능 | n 번 ++it 수행 |
BidirectionalIterator | ++ , -- 가능 | 양수일 경우 ++ , 음수일 경우 -- |
RandomAccessIterator | + , - 연산 가능 | it += n 사용 |
주의 사항
- 음수 이동은
BidirectionalIterator
이상에서만 가능하다. std::advance
는 반복자를 직접 수정한다 (값을 반환하지 않음).- 범위를 벗어나면 정의되지 않은 동작(undefined behavior)이 발생할 수 있다.
요약
std::advance(it, n)
는 반복자를n
만큼 이동시킨다.- 반복자의 타입에 따라 최적의 방식으로 이동한다.
std::next
와 달리 값을 반환하지 않고, 반복자를 직접 수정한다.- C++17부터는
constexpr
로 지정되어 컴파일 타임에서도 사용 가능하다.
관련 함수
std::next(it, n)
: 반복자를n
만큼 이동한 새 반복자를 반환 (원본 유지)std::prev(it, n)
: 반복자를n
만큼 뒤로 이동한 새 반복자를 반환