개념

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만큼 뒤로 이동한 새 반복자를 반환