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::transform
garantiert nicht die ordnungsgemäße Anwendung vonunary_op
oderbinary_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::transform
ist jedoch a, für LegacyOutputIterator
den die folgende Nachbedingung gilt ++r
:
Danach muss dieser Vorgang
r
nicht mehr inkrementierbar sein, und Kopien des vorherigen Werts von müssenr
nicht 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_op
mö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 LegacyOutputIterator
sie durch Inkrementieren von Kopien ungültig gemacht werden kann.
Was vermisse ich?
s
, wodurch Iteratoren ungültig werden.
std::transform
Exaktionsrichtlinie verwenden, ist ein Iterator mit wahlfreiem Zugriff erforderlich, der back_inserter
nicht erfüllt werden kann. Die von IMO zitierte Teiledokumentation bezieht sich auf dieses Szenario. Beispiel in der Dokumentation beachten std::back_inserter
.
transform
Version, die entscheidet, ob Paralelismus verwendet wird oder nicht. Dastransform
für große Vektoren schlägt fehl.