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великих векторів не вдається.