for_each의 핵심

정의

  • std::for_each는 주어진 범위의 모든 요소에 함수(Callable)를 적용합니다.
  • 목적은 "요소마다 같은 작업 수행"을 의도적으로 표현하는 것입니다.
std::for_each(first, last, func);

반환값까지 이해하기

  • for_each는 호출한 함수 객체(func)를 반환합니다.
  • 그래서 상태를 가진 펑터와 함께 쓰면, 처리 결과를 펑터 내부에 모아 둘 수 있습니다.
struct Sum {
    int value = 0;
    void operator()(int n) { value += n; }
};

Sum s = std::for_each(v.begin(), v.end(), Sum{});
// s.value에 누적값이 들어 있음

기본 사용 예시

struct MultiplyBy3 {
    void operator()(int& n) const { n *= 3; }
};
std::for_each(v.begin(), v.end(), MultiplyBy3());

람다 버전:

std::for_each(v.begin(), v.end(), [](int& n) { n *= 3; });

값/참조 선택 규칙

// 읽기 전용
std::for_each(v.begin(), v.end(), [](const int& n) {
    std::cout << n << ' ';
});

// 원본 수정
std::for_each(v.begin(), v.end(), [](int& n) {
    n *= 3;
});
  • 원본 수정이 필요하면 int&처럼 참조로 받아야 합니다.
  • 큰 객체는 const T&를 써서 복사 비용을 줄이는 것이 좋습니다.

for_each vs range-for (언제 무엇을 쓸까?)

상황추천
단순 순회, 코드 가독성 최우선range-for
"알고리즘 스타일"로 의도 명시for_each
상태를 가진 Callable 재사용for_each + 펑터
조기 종료(break)가 필요일반 for / find_if / any_of

실무 감각:

  • 단순 순회는 range-for가 가장 읽기 쉽습니다.
  • 알고리즘 체계로 통일하거나 Callable 재사용이 중요할 때 for_each가 빛납니다.

자주 하는 실수 + 체크 질문

자주 하는 실수

실수문제
수정 의도인데 값 전달(int n) 사용원본이 바뀌지 않음
for_each 안에서 break 기대불가능 (return은 람다만 종료)
복잡한 변환까지 for_each에 몰아넣음의도 모호, transform 등이 더 적합할 수 있음
캡처 [&] 남발수명/부작용 추적 어려움

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

  • for_each와 range-for 중 어떤 기준으로 선택하는가?
  • for_each에서 왜 break가 어렵고, 대안은 무엇인가?
  • 원본 수정/읽기 전용 상황에서 람다 파라미터를 어떻게 선언해야 하는가?

profile
李家네_공부방

0개의 댓글