이전 글 : 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
'자료구조와 알고리즘' 카테고리의 다른 글
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Unordered Associative (0) | 2023.05.06 |
---|---|
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Associative (1) | 2023.04.12 |
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Sequence (0) | 2023.04.10 |
Certi Pro 취득을 위해 꼭 알아야 할 STL Algorithm (0) | 2023.04.01 |
Certi Pro 취득을 위해 꼭 알아야 할 CPP 기본 문법 (feat. STL) (0) | 2023.03.31 |
댓글