Iterators

반복자 계약

iterator는 포인터처럼 보이지만 컨테이너마다 가능한 이동과 무효화 규칙이 다르다. begin/end 반열림 구간과 카테고리를 함께 읽어야 한다.

01

구간 생성

시작은 포함하고 끝은 제외하는 [first, last) 규칙으로 빈 구간을 자연스럽게 표현한다.

02

이동 능력 확인

sort처럼 random access를 요구하는 알고리즘에는 list iterator를 넘길 수 없다.

03

변경 뒤 폐기한다

erase, insert, push_back 이후 기존 iterator가 살아 있는지 컨테이너별 규칙을 본다.

input
한 번 읽기 스트림처럼 앞으로만 읽고 이전 값을 다시 보장하지 않는다.
두 번 순회하면 안 되는 범위가 있다.
forward
여러 번 순회 단방향이지만 같은 범위를 반복해서 읽을 수 있다.
single-pass와 구분한다.
bidirectional
앞뒤 이동 list, set, map iterator처럼 -- 연산이 가능하다.
랜덤 접근은 아니다.
random access
인덱스 이동 vector, deque처럼 +n, last-first가 가능하다.
sort 요구 조건에 맞는다.

end 역참조 · erase 루프 · 알고리즘 요구 점검

end 역참조 end iterator는 마지막 원소가 아니라 경계 표시이므로 역참조하지 않는다.
erase 루프 삭제 후 반환된 iterator로 다음 위치를 이어 가는가.
알고리즘 요구 사용하려는 알고리즘이 요구하는 iterator category와 컨테이너가 맞는가.

erase 루프

for (auto it = items.begin(); it != items.end(); ) {
    if (it->expired()) it = items.erase(it);
    else ++it;
}