반복자란

반복자는 컨테이너 내의 원소를 순회하기 위해 사용하는 도구이다. 포인터와 유사한 부분이 있는데, 컨테이너 내의 원소를 하나씩 훑어 나갈 때 사용하는 도구이다.

반복자는 컨테이너에 대해 사용하는데, 벡터 컨테이너의 경우 begin()과 end() 메서드로 컨테이너의 첫 원소와 마지막 원소 다음 원소를 가르키는 iterator를 얻을 수 있다.

반복자의 타입은 std:컨테이너:: iterator와 같은 식으로 정의되어 있다. 반복자는 포인터와 유사한 부분이 있다고 얘기했는데, 포인터와 같이 *iterator로 호출하면 iterator가 가르키고 있는 원소의 값을 알 수 있다.

반복자의 활용

반복자는 +와 -같은 연산자를 활용해 앞 뒤의 원소로 접근할 수 있으며 erase와 insert라는 컨테이너의 메서드에 인자로 활용되어 컨테이너의 특정 인덱스에 원소를 삽입하거나 제거하는 것을 가능하게 해준다.

insert(컨테이너.begin()+2 , x) 컨테이너의 두 번째 원소 뒤에 x라는 값을 삽입한다는 뜻이다. erase역시 같은 방식으로 작동한다.
벡터에서 erase와 insert를 사용할 때는 주의할 점이 있는데, 한번 insert나 erase가 수행된 벡터에서의 반복자는 더 이상 유효한 반복자로 취급되지 않기 때문에 다시 선언해주어야 한다. 아마 벡터 내의 원소 개수에 변화가 생겼기 때문에 같은 반복자를 더이상 사용하지 못하게 되는 것 같다.

  • 반복자를 매 루프마다 다시 선언해 주는 모습
for (; itr != vec.end(); ++itr) {
  if (*itr == 20) {
    vec.erase(itr);
    itr = vec.begin();
  }
}