Namespaces
Variants

std::for_each_n

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

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


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

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

1) f는 first부터 순서대로 적용됩니다.
UnaryFunc가 MoveConstructible이 아닌 경우, 동작은 정의되지 않습니다.
2) f는 순서대로 적용되지 않을 수 있습니다. 알고리즘은 policy에 따라 실행됩니다.
다른 병렬 알고리즘과 달리, for_each_n는 대상 범위의 요소를 임의로 복사할 수 없습니다.
이 오버로드는 다음 표현식의 값이 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이 아닌 경우, 동작은 정의되지 않습니다.

count >= 0가 true이 아닌 경우, 동작은 정의되지 않습니다.

매개변수

first - 대상 범위의 시작
count - 대상 범위의 요소 수
f - 함수 객체, 요소에 적용될 것

함수의 시그니처는 다음과 같아야 합니다:

void fun(const Type &a);

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

​

policy - 사용할 실행 정책
유형 요구 사항
-
InputIt는 LegacyInputIterator의 요구 사항을 충족해야 합니다.
-
ForwardIt는 LegacyForwardIterator의 요구 사항을 충족해야 합니다.
-
Size는 정수 유형으로 변환 가능해야 합니다.

반환값

std::next(first, count)

복잡도

정확히 count번의 f 적용.

예외

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

참고

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

가능한 구현

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

template<class InputIt, class Size, class UnaryFunc>
InputIt for_each_n(InputIt first, Size count, UnaryFunc f)
{
    for (Size i = 0; i < count; ++first, (void) ++i)
        f(*first);
    
    return first;
}

예제

#include <algorithm>
#include <iostream>
#include <vector>

void println(const auto& v)
{
    for (auto count{v.size()}; const auto& e : v)
        std::cout << e << (--count ? ", " : "\n");
}

int main()
{
    std::vector<int> vi{1, 2, 3, 4, 5};
    println(vi);
    
    std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; });
    println(vi);
}

출력:

1, 2, 3, 4, 5
2, 4, 6, 4, 5

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3213
(P1718R2)
C++17 Size가 정수 유형으로 변환 가능해야 할 필요가 없었음 필요함

참조

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