struct IsOdd {
bool operator()(int n) const { return n % 2 != 0; }
};
int oddCount = static_cast<int>(std::count_if(v.begin(), v.end(), IsOdd()));
int oddCount = static_cast<int>(
std::count_if(v.begin(), v.end(), [](int n) { return n % 2 != 0; })
);
difference_type)이며, 보통 정수형으로 사용합니다.O(N).// 체력이 0 이하인 몬스터 수
int deadCount = static_cast<int>(
std::count_if(monsters.begin(), monsters.end(),
[](const Monster& m) { return m.hp <= 0; })
);
| 함수 | 질문 형태 | 반환 |
|---|---|---|
| all_of | 모두 조건을 만족하는가? | bool |
| any_of | 하나라도 조건을 만족하는가? | bool |
| none_of | 아무도 조건을 만족하지 않는가? | bool |
bool allOdd = std::all_of(v.begin(), v.end(),
[](int n) { return n % 2 != 0; });
bool hasOdd = std::any_of(v.begin(), v.end(),
[](int n) { return n % 2 != 0; });
bool noOdd = std::none_of(v.begin(), v.end(),
[](int n) { return n % 2 != 0; });
all_of: 조건을 하나라도 깨는 원소를 찾는 순간 종료any_of: 조건을 만족하는 원소를 찾는 순간 종료none_of: 조건을 만족하는 원소를 찾는 순간 종료(즉시 false)즉, 최악은 O(N)이지만 평균적으로 더 빨리 끝날 수 있습니다.
컨테이너가 비어 있을 때:
all_of -> trueany_of -> falsenone_of -> true처음 보면 헷갈리지만, 논리적으로는 "반례가 없어서 all/none은 true"로 이해하면 쉽습니다.
| 하고 싶은 질문 | 추천 함수 |
|---|---|
| "조건 만족 원소가 몇 개인가?" | count_if |
| "전부 유효한가?" | all_of |
| "하나라도 위험한가?" | any_of |
| "금지 조건 원소가 아예 없는가?" | none_of |
실무 감각:
all_of, none_ofany_ofcount_if| 실수 | 문제 |
|---|---|
존재 여부를 count_if > 0으로만 처리 | any_of가 의도를 더 잘 표현하고 조기 종료 가능 |
| Predicate에서 큰 객체 값 복사 | 불필요한 복사 비용 |
| empty range 결과를 오해 | 검증 로직에서 반대 결과 버그 발생 |
| 조건이 긴데 한 줄 람다에 과도하게 작성 | 가독성 저하, 디버깅 어려움 |
count_if와 any_of를 "존재 여부 확인"에서 어떻게 구분해 선택할까?all_of가 왜 true인지 설명할 수 있는가?all_of/any_of/none_of가 조기 종료되는 조건을 각각 말할 수 있는가?