C++ · STL

STL 알고리즘 계약과 반복자 범위

STL 알고리즘은 컨테이너가 아니라 [first, last) 반복자 범위와 predicate/comparator 계약을 받습니다. 범위 무효화와 복잡도도 호출자의 책임입니다.

범위와 함수 객체의 약속

[first,last)

Container

vector 삽입처럼 컨테이너를 바꾸면 기존 반복자가 무효화될 수 있어 알고리즘 실행 중 구조 변경을 피합니다.

Iterator Range

first는 포함, last는 제외입니다. 서로 다른 컨테이너의 반복자를 섞으면 범위 계약이 깨집니다.

category

sort는 random access iterator가 필요하고 O(N log N)을 기대합니다. list에는 list::sort를 씁니다.

transform

출력 범위는 충분해야 합니다. 크기를 모르면 back_inserter를 쓰고, 겹치는 입출력은 알고리즘별 허용 여부를 확인합니다.

Predicate

predicate는 bool 조건, comparator는 strict weak ordering을 지켜야 sort 결과가 안정적으로 정의됩니다.

container [first,last) algorithm predicate result

STL 알고리즘 계약 정리

알고리즘 이름만 보지 말고 반복자 범위의 유효성, 쓰기 가능한 출력 공간, 비교 함수의 엄격 약순서, 컨테이너 변경으로 인한 무효화를 같이 확인합니다.