std::for_each_n
cppreference.net에서
| 헤더 <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인 경우에만 오버로드 해결에 참여합니다:
|
|
(C++20까지) |
|
|
(C++20부터) |
UnaryFunc가 CopyConstructible이 아닌 경우, 동작은 정의되지 않습니다.count >= 0가 true이 아닌 경우, 동작은 정의되지 않습니다.
매개변수
| first | - | 대상 범위의 시작 |
| count | - | 대상 범위의 요소 수 |
| f | - | 함수 객체, 요소에 적용될 것 함수의 시그니처는 다음과 같아야 합니다:
시그니처는 |
| 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가 정수 유형으로 변환 가능해야 할 필요가 없었음
|
필요함 |
참조
(C++20) |
시퀀스의 처음 N개 요소에 함수 객체를 적용합니다 (알고리즘 함수 객체) |
| 단항 함수 객체를 범위 의 요소에 적용합니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
| 함수를 요소 범위에 적용하고 결과를 대상 범위에 저장합니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
범위 기반 for 루프(C++11)
|
범위에 대해 루프를 실행합니다 |