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
версією, яка вирішує, використовувати паралелізм чи ні. Дляtransform
великих векторів не вдається.