알고리즘 라이브러리: find, sort, remove_if를 먼저 고려하기
16강. 알고리즘 라이브러리: find, sort, remove_if를 먼저 고려하기
이번 강의에서 해결할 문제
모든 반복을 직접 인덱스로 작성하면 경계 조건, iterator 증가와 제거 로직이 섞입니다. 표준 알고리즘은 “무엇을 하는가”를 이름으로 드러내고 검증된 반복 구조를 재사용하지만, 범위와 결과 처리 계약을 이해해야 합니다.
학습 목표
먼저 알아야 할 핵심 개념
알고리즘은 iterator 범위와 조건 함수로 컨테이너에서 동작합니다. find_if는 조건을 만족하는 첫 위치, sort는 순서를 재배치하고, remove_if는 제거 대상이 아닌 원소를 앞으로 모은 뒤 새 논리 끝을 반환합니다. 실제 vector 크기를 줄이려면 erase가 이어져야 합니다.
왜 이 문제가 위험한가
remove_if만 호출하고 크기가 줄었다고 생각하면 뒤쪽에 유효하지만 미지정된 나머지 원소가 남습니다. 정렬 비교 함수가 엄격 약순서를 지키지 않으면 결과가 올바르지 않습니다. 알고리즘 실행 중 같은 컨테이너를 구조적으로 변경하는 콜백도 iterator를 무효화할 수 있습니다.
가장 작은 예제로 시작하기
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct Task { std::string name; int priority{}; bool completed{}; };
int main() {
std::vector<Task> tasks{{"test", 1, true}, {"build", 3, false}, {"docs", 2, false}};
std::sort(tasks.begin(), tasks.end(), [](const Task& a, const Task& b) {
return a.priority > b.priority;
});
const auto newEnd = std::remove_if(tasks.begin(), tasks.end(),
[](const Task& task) { return task.completed; });
tasks.erase(newEnd, tasks.end());
for (const Task& task : tasks) std::cout << task.name << '\n';
}
코드 한 줄씩 이해하기
sort는 전체 반열린 범위의 작업 순서를 바꿉니다.- 비교 함수는 우선순위가 큰 작업을 앞에 둡니다.
remove_if는 완료 작업을 논리 범위 뒤로 보내고 새 끝을 반환합니다.erase가 실제 컨테이너 크기를 줄입니다.- 최종 범위 기반 for는 남은 작업만 순회합니다.
실행 결과와 메모리·동작 흐름
출력은 build, docs 순서입니다. sort 뒤 작업 위치가 바뀌므로 이전 포인터·iterator를 재사용하지 않습니다. remove_if와 erase 사이에는 vector 크기가 아직 원래 값이며 erase가 완료된 뒤 2가 됩니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
표준 검색·정렬·집계·변환으로 의도가 표현되면 알고리즘을 우선합니다. 매우 복잡한 상태 기계나 여러 조기 종료가 얽혀 알고리즘 조합이 더 읽기 어렵다면 명확한 반복문을 사용하고 경계 테스트를 작성합니다.
게임 개발 연결
Unreal의 Algo 네임스페이스와 컨테이너 멤버 함수는 표준 알고리즘과 이름·계약이 다를 수 있습니다. 검색·정렬·필터라는 사고방식은 유지하되 엔진 API의 반환과 무효화 규칙을 확인합니다.
이해 점검 질문 3개
- remove_if가 vector 크기를 직접 줄이지 않는 이유는 무엇인가요?
- 정렬 비교 함수가 동등한 두 값에 false를 반환해야 하는 이유는 무엇인가요?
- 알고리즘 콜백에서 같은 vector에 push_back하면 왜 위험한가요?
핵심 요약
다음 강의 연결
17강. 람다와 함수 객체에서 알고리즘 조건과 콜백의 상태·수명을 설계합니다.
알고리즘 라이브러리: find, sort, remove_if를 먼저 고려하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.