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
。
これはおそらく並列実装を可能にするためです。しかし、の3番目のパラメータは、std::transform
あるLegacyOutputIterator
ため、次の事後条件を有しています++r
。
この操作の後
r
は、増分可能である必要はなく、以前の値のコピーは、r
逆参照可能または増分可能である必要がなくなります。
したがって、出力の割り当ては順番に行わなければならないように思えます。それらは単に、アプリケーションunary_op
が故障し、一時的な場所に保存されているが、出力に順番にコピーされる可能性があることを意味していますか?それはあなたがしたいことのようには聞こえません。
ほとんどのC ++ライブラリは、実際には並列実行プログラムをまだ実装していませんが、Microsoftは実装しています。私はかなり確信している、これは関連するコードである、と私は考えてそれが呼び出すこのpopulate()
機能をするので確実に行うために有効なものではありません出力、のチャンクにレコードイテレータに LegacyOutputIterator
それのコピーをインクリメントすることによって無効にすることができます。
何が欠けていますか?
s
、コードが正しくありません。イテレータが無効になります。
std::transform
exaction方針で、その後ランダムアクセスイテレータが必要とされているback_inserter
果たすことができません。IMOの引用部分のドキュメントはそのシナリオを参照しています。ドキュメントの例ではを使用していstd::back_inserter
ます。
transform
並列処理を使用するかどうかを決定するバージョン。transform
大きなベクトルのために失敗します。