count_if, all_of, any_of, none_of

Jaemyeong Lee·2024년 12월 6일

게임 서버1

목록 보기
97/220

count_if

용도

  • 조건을 만족하는 요소의 개수를 셉니다.
  • "몇 개나 있는가?"라는 질문에 정확히 대응합니다.
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, any_of, none_of

의미 비교

함수질문 형태반환
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; });

short-circuit(조기 종료)

  • all_of: 조건을 하나라도 깨는 원소를 찾는 순간 종료
  • any_of: 조건을 만족하는 원소를 찾는 순간 종료
  • none_of: 조건을 만족하는 원소를 찾는 순간 종료(즉시 false)

즉, 최악은 O(N)이지만 평균적으로 더 빨리 끝날 수 있습니다.


빈 범위(empty range) 동작 (중요)

컨테이너가 비어 있을 때:

  • all_of -> true
  • any_of -> false
  • none_of -> true

처음 보면 헷갈리지만, 논리적으로는 "반례가 없어서 all/none은 true"로 이해하면 쉽습니다.


어떤 함수를 선택할까?

하고 싶은 질문추천 함수
"조건 만족 원소가 몇 개인가?"count_if
"전부 유효한가?"all_of
"하나라도 위험한가?"any_of
"금지 조건 원소가 아예 없는가?"none_of

실무 감각:

  • 비즈니스 규칙 검증: all_of, none_of
  • 존재 여부 빠른 확인: any_of
  • 통계/카운팅: count_if

자주 하는 실수 + 체크 질문

자주 하는 실수

실수문제
존재 여부를 count_if > 0으로만 처리any_of가 의도를 더 잘 표현하고 조기 종료 가능
Predicate에서 큰 객체 값 복사불필요한 복사 비용
empty range 결과를 오해검증 로직에서 반대 결과 버그 발생
조건이 긴데 한 줄 람다에 과도하게 작성가독성 저하, 디버깅 어려움

체크 질문 (스스로 답해보기)

  • count_ifany_of를 "존재 여부 확인"에서 어떻게 구분해 선택할까?
  • 빈 벡터에서 all_of가 왜 true인지 설명할 수 있는가?
  • all_of/any_of/none_of가 조기 종료되는 조건을 각각 말할 수 있는가?

profile
李家네_공부방

0개의 댓글