C++ 알고리즘

STL 알고리즘 계약

알고리즘은 컨테이너 멤버가 아니라 iterator 범위를 받아 동작한다. 정렬 여부, 비교 함수의 strict weak ordering, 출력 iterator의 공간 확보를 확인해야 안전하다.

01

범위 선택

어떤 컨테이너의 어느 구간에 적용할지 iterator 쌍으로 명확히 지정한다.

부분 범위 가능
02

전제 확인

binary_search, lower_bound는 정렬된 범위가 전제임을 확인한다.

전제 위반은 오답
03

함수 객체

predicate와 comparator가 상태를 캡처할 때 수명과 부작용을 점검한다.

순수성 선호
04

결과 처리

copy, transform 등은 output iterator가 충분한 공간이나 back_inserter를 가져야 한다.

쓰기 위치
sort
random access 필요 list에는 std::sort가 아니라 list::sort를 써야 한다.
카테고리 요구
find_if
조건 기반 선형 탐색 predicate가 true를 반환하는 첫 원소를 찾는다.
O(n)
lower_bound
정렬 범위에서 위치 탐색 비교 기준이 정렬 때와 같아야 결과가 의미 있다.
정렬 전제
remove
논리적 제거 컨테이너 크기를 줄이지 않으므로 erase와 함께 쓰는 erase-remove idiom이 필요하다.
꼬리 값 남음

비교 함수 · 캡처 · 출력 공간 점검

비교 함수 a<b와 b<a가 동시에 true가 되지 않는 strict weak ordering인지 본다.
캡처 람다 캡처가 dangling reference를 만들지 않는지 확인한다.
출력 공간 transform/copy 결과를 쓸 대상이 resize되었거나 inserter를 쓰는지 본다.

erase-remove 기본형

v.erase(std::remove(v.begin(), v.end(), value), v.end());