Namespaces
Variants

std::for_each

cppreference.net에서
 
 
알고리즘 라이브러리
제약 알고리즘 및 범위 알고리즘 (C++20)
제약 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에서)
집합 연산 (정렬된 범위에서)
병합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
헤더 <algorithm>
template< class InputIt, class UnaryFunc >
UnaryFunc for_each( InputIt first, InputIt last, UnaryFunc f );
에 정의됨 (1) (C++20부터 constexpr)
template< class ExecutionPolicy, class ForwardIt, class UnaryFunc >
void for_each( ExecutionPolicy&& policy,
               ForwardIt first, ForwardIt last, UnaryFunc f );
(2) (C++17부터)

주어진 호출 가능 객체 f 를 대상 범위 [first, last) 의 각 요소에 적용합니다. f 가 결과를 반환하면 결과는 무시됩니다.

1) f 는 first 부터 순서대로 적용됩니다.

UnaryFunc 가 MoveConstructible 이 아니면 동작은 정의되지 않습니다.

(C++11부터)
2) f 는 순서대로 적용되지 않을 수 있습니다. 알고리즘은 policy 에 따라 실행됩니다.
다른 병렬 알고리즘 과 달리 for_each 는 대상 범위에서 요소의 임의 복사본을 만들 수 없습니다.
이 오버로드는 다음 표현식의 값이 true 인 경우에만 오버로드 해결에 참여합니다:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20까지)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20부터)
UnaryFunc 가 CopyConstructible 이 아니면 동작은 정의되지 않습니다.

매개변수

first, last - 대상 범위
를 정의하는 반복자 쌍 - 요소에 적용될 함수 객체

함수의 시그니처는 다음과 동일해야 합니다:

void fun(const Type &a);

시그니처에 const & 이 있을 필요는 없습니다.
Type 형식은 InputIt 형식의 객체를 역참조한 후 Type 로 암시적으로 변환할 수 있어야 합니다.

​

policy - 사용할 실행 정책
형식 요구 사항
-
InputIt 는 LegacyInputIterator 의 요구 사항을 충족해야 합니다.
-
ForwardIt 는 LegacyForwardIterator 의 요구 사항을 충족해야 합니다.

반환값

1) f

복잡성

정확히 std::distance(first, last) 번의 f 적용.

예외

2) 실행 과정 중:
  • 병렬화에 필요한 임시 메모리 자원을 사용할 수 없으면 std::bad_alloc 이 발생합니다.
  • 알고리즘 인수를 통해 객체에 접근하는 동안 잡히지 않은 예외가 발생하면 동작은 실행 정책에 따라 결정됩니다 (표준 정책 의 경우 std::terminate 가 호출됩니다).

참고

반복자 형식 (InputIt/ForwardIt) 이 변경 가능하면 f 는 대상 범위의 요소를 수정할 수 있습니다.

오버로드 (1) 의 경우 f 는 상태를 가진 호출 가능 객체일 수 있습니다. 반환값은 일괄 연산의 최종 상태로 간주할 수 있습니다.

오버로드 (2) 의 경우 병렬 호출을 수행하기 위해 f 의 여러 복사본이 생성될 수 있습니다. 병렬화는 종종 효율적인 상태 누적을 허용하지 않으므로 값이 반환되지 않습니다.

가능한 구현

libstdc++, libc++ 및 MSVC stdlib 의 구현도 참조하십시오.

template<class InputIt, class UnaryFunc>
constexpr UnaryFunc for_each(InputIt first, InputIt last, UnaryFunc f)
{
    for (; first != last; ++first)
        f(*first);
    
    return f; // implicit move since C++11
}

예제

다음 예제는 람다 표현식 을 사용하여 벡터의 모든 요소를 증가시킨 다음 오버로드된 operator() 를 호출 가능 객체로 사용하여 합계를 계산합니다. 합계를 계산하려면 전용 알고리즘 std::accumulate 을 사용하는 것이 좋습니다.

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{3, -4, 2, -8, 15, 267};
    
    auto print = [](const int& n) { std::cout << n << ' '; };
    
    std::cout << "before:\t";
    std::for_each(v.cbegin(), v.cend(), print);
    std::cout << '\n';
    
    // increment elements in-place
    std::for_each(v.begin(), v.end(), [](int &n) { n++; });
    
    std::cout << "after:\t";
    std::for_each(v.cbegin(), v.cend(), print);
    std::cout << '\n';
    
    struct Sum
    {
        void operator()(int n) { sum += n; }
        int sum {0};
    };
    
    // invoke Sum::operator() for each element
    Sum s = std::for_each(v.cbegin(), v.cend(), Sum());    
    std::cout << "sum:\t" << s.sum << '\n';
}

출력:

before:	3 -4 2 -8 15 267 
after:	4 -3 3 -7 16 268 
sum:	281

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급하여 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 475 C++98 f 가 반복되는 시퀀스의 요소를 수정할 수 있는지
명확하지 않았습니다 (for_each 는
"비수정 시퀀스 연산"으로 분류됨)
명확히 함 (반복자
형식이 변경 가능하면 허용)
LWG 2747 C++11 오버로드 (1) 반환 std::move(f) 반환 f (암시적으로 이동함)

함께 보기

단항 함수 객체 를 범위
의 요소에 적용합니다 (알고리즘 함수 객체)
시퀀스의 처음 N개 요소에 함수 객체를 적용합니다
(함수 템플릿 & 알고리즘 함수 객체)
요소 범위에 함수를 적용하고 결과를 대상 범위에 저장합니다
(함수 템플릿 & 알고리즘 함수 객체)
범위-for for 루프 (C++11) 범위에 대한 루프 실행