Cppreference hat diesen Beispielcode für 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; });
Es heißt aber auch:
std::transformgarantiert nicht die ordnungsgemäße Anwendung vonunary_opoderbinary_op. Verwenden Sie zum Anwenden einer Funktion auf eine Sequenz in der angegebenen Reihenfolge oder zum Anwenden einer Funktion, die die Elemente einer Sequenz ändertstd::for_each.
Dies soll vermutlich parallele Implementierungen ermöglichen. Der dritte Parameter von std::transformist jedoch a, für LegacyOutputIteratorden die folgende Nachbedingung gilt ++r:
Danach muss dieser Vorgang
rnicht mehr inkrementierbar sein, und Kopien des vorherigen Werts von müssenrnicht mehr dereferenzierbar oder inkrementierbar sein.
Es scheint mir also, dass die Zuordnung der Ausgabe in der richtigen Reihenfolge erfolgen muss. Bedeuten sie einfach, dass die Anwendung von unary_opmöglicherweise nicht in Ordnung ist und an einem temporären Speicherort gespeichert, aber in der angegebenen Reihenfolge in die Ausgabe kopiert wird? Das klingt nicht nach etwas, das Sie jemals tun möchten.
Die meisten C ++ - Bibliotheken haben noch keine parallelen Executoren implementiert, Microsoft jedoch. Ich bin mir ziemlich sicher, dass dies der relevante Code ist, und ich denke, er ruft diese populate()Funktion auf, um Iteratoren in Blöcken der Ausgabe aufzuzeichnen, was sicherlich keine gültige Vorgehensweise ist, da LegacyOutputIteratorsie durch Inkrementieren von Kopien ungültig gemacht werden kann.
Was vermisse ich?
s, wodurch Iteratoren ungültig werden.
std::transformExaktionsrichtlinie verwenden, ist ein Iterator mit wahlfreiem Zugriff erforderlich, der back_inserternicht erfüllt werden kann. Die von IMO zitierte Teiledokumentation bezieht sich auf dieses Szenario. Beispiel in der Dokumentation beachten std::back_inserter.
transformVersion, die entscheidet, ob Paralelismus verwendet wird oder nicht. Dastransformfür große Vektoren schlägt fehl.