Cppreference에는 다음에 대한 예제 코드가 있습니다 std::transform
.
std::vector<std::size_t> ordinals;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](unsigned char c) -> std::size_t { return c; });
그러나 그것은 또한 말합니다 :
std::transform
unary_op
또는의 순서대로 적용 할 수있는 것은 아닙니다binary_op
. 시퀀스에 순서대로 함수를 적용하거나 시퀀스의 요소를 수정하는 함수를 적용하려면을 사용하십시오std::for_each
.
이것은 아마도 병렬 구현을 허용하는 것입니다. 그러나 세번째의 파라미터 std::transform
A는 LegacyOutputIterator
에 대해 다음 사후을 갖는다 ++r
:
이 조작 후에
r
증분 할r
필요가없고 이전 값의 사본을 더 이상 역 참조 또는 증분 할 필요가 없습니다.
따라서 출력 할당이 순서대로 이루어져야한다고 생각합니다 . 그것들은 단순히 응용 프로그램의 unary_op
순서가 잘못되어 임시 위치에 저장되었지만 출력에 순서대로 복사된다는 것을 의미합니까? 그것은 당신이하고 싶은 것 같지 않습니다.
대부분의 C ++ 라이브러리는 실제로 병렬 실행기를 아직 구현하지 않았지만 Microsoft는 아직 구현했습니다. 나는 이것이 관련 코드 라고 확신 하며, 반복적으로 출력 청크에 반복자를 기록하기 위해이 함수 를 호출 한다고 생각 합니다.populate()
LegacyOutputIterator
내가 무엇을 놓치고 있습니까?
s
반복자를 무효화 하므로 코드가 잘못되었습니다 .
std::transform
수렴 정책을 다음 랜덤 액세스 반복자가 필요합니다 어떤 back_inserter
성취 할 수 없다. 인용 된 IMO 부품 문서는 해당 시나리오를 나타냅니다. 설명서의 예제는을 사용합니다 std::back_inserter
.
transform
병렬화를 사용할지 여부를 결정하는 C ++ 20 및 버전.transform
큰 벡터에 실패합니다.