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&를 써서 복사 비용을 줄이는 것이 좋습니다.| 상황 | 추천 |
|---|---|
| 단순 순회, 코드 가독성 최우선 | range-for |
| "알고리즘 스타일"로 의도 명시 | for_each |
| 상태를 가진 Callable 재사용 | for_each + 펑터 |
조기 종료(break)가 필요 | 일반 for / find_if / any_of |
실무 감각:
for_each가 빛납니다.| 실수 | 문제 |
|---|---|
수정 의도인데 값 전달(int n) 사용 | 원본이 바뀌지 않음 |
for_each 안에서 break 기대 | 불가능 (return은 람다만 종료) |
복잡한 변환까지 for_each에 몰아넣음 | 의도 모호, transform 등이 더 적합할 수 있음 |
캡처 [&] 남발 | 수명/부작용 추적 어려움 |
for_each와 range-for 중 어떤 기준으로 선택하는가?for_each에서 왜 break가 어렵고, 대안은 무엇인가?