본문 바로가기
자료구조와 알고리즘

Certi Pro 취득을 위해 꼭 알아야 할 iterator

by varcode 2023. 4. 2.
반응형

이전 글 : Certi Pro 취득을 위해 꼭 알아야 할 STL Algorithm

 

CPP을 사용한다면 반드시 알아야 할 개념이 바로 iterator이다.

Iterator는 포인터와 상당히 비슷하며 컨테이너에 저장된 원소들을 참조할 때 사용되는 객체이다.

 

① Iterator Operation

  • distance(v.begin(), it) : 두 iterator 사이의 거리 반환
  • advance(it, 3) : it를 다음 3번째 iterator로 이동
  • new_it = next(it, 3) : new_it에 it의 3번째 이후 iterator 저장
  • new_it = prev(it, 3) : new_it에 it의 3번째 이전 iterator 저장

advance(it, 3)은 it+=3과 같은 의미이며 next(it, 3)은 it+3과 같은 의미이다.

it 자체를 3만큼 이동시키냐, it로부터 3만큼 떨어진 iterator를 사용하느냐의 차이인 것이다.

 

② Reverse Iterator

reverse iterator는 반대 방향으로 순회하기 위한 iterator adaptor이다.

container의 begin() / end()가 정방향 iterator type을 반환한다면, rbegin() / rend()은 reverse iterator type을 반환한다.

1) 정방향 순회

for(auto it = v.begin(); it != v.end(); ++it){
    /* process */
}

 

2) 역방향 순회

for(auto it = v.end(); it != v.begin();){
    --it;
    /* process */
}

for(auto it = v.rbegin(); it != v.rend(); ++it){
    /* process */
}

 

※ iterator invalidation

만약 iterator로 순회하다가 특정 원소를 삭제해 버리면, iterator가 invalid 하게 되어 그다음 원소를 찾을 수 없어진다.

.erase() 메서드의 return 값은 "다음 iterator"이므로 원소 삭제 시에는 반드시 return 된 iterator를 받아줘야 한다.

for(auto it = v.begin(); it != v.end(); ++it){
    v.erase(it); // X
    it = v.erase(it); // O
}

 

※ iterator 기록

추후에 다루겠지만, pro 시험에서 iterator를 저장하여 O(1)만에 원하는 데이터를 찾는 테크닉이 종종 쓰인다.

iterator를 기록하면 효율적인 활용이 가능하다는 것을 기억해 두자.

 

다음 글 : Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Sequence

 

반응형

댓글