Cppreference memiliki kode contoh ini untuk 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; });
Tetapi juga dikatakan:
std::transform
tidak menjamin aplikasiunary_op
ataubinary_op
. Untuk menerapkan fungsi ke urutan secara berurutan atau menerapkan fungsi yang memodifikasi elemen urutan, gunakanstd::for_each
.
Ini mungkin untuk memungkinkan implementasi paralel. Namun parameter ketiga std::transform
adalah LegacyOutputIterator
yang memiliki postcondition berikut untuk ++r
:
Setelah operasi
r
ini tidak perlu bertambah dan salinan dari nilai sebelumnyar
tidak lagi diperlukan untuk dereferensi atau bertambah.
Jadi menurut saya penugasan output harus dilakukan secara berurutan. Apakah mereka hanya berarti bahwa aplikasi unary_op
mungkin rusak, dan disimpan ke lokasi sementara, tetapi disalin ke output secara berurutan? Itu tidak terdengar seperti sesuatu yang ingin Anda lakukan.
Kebanyakan pustaka C ++ belum benar-benar mengimplementasikan eksekutor paralel, tetapi Microsoft telah melakukannya. Saya cukup yakin ini adalah kode yang relevan, dan saya pikir ini memanggil fungsi inipopulate()
untuk merekam iterator ke potongan output, yang tentunya bukan hal yang valid untuk dilakukan karena LegacyOutputIterator
dapat dibatalkan dengan menambah salinannya.
Apa yang saya lewatkan?
s
, yang membatalkan iterator.
std::transform
dengan kebijakan exaction, diperlukan iterator akses acak yang back_inserter
tidak dapat dipenuhi. Dokumentasi bagian yang dikutip IMO mengacu pada skenario itu. Perhatikan contoh dalam penggunaan dokumentasi std::back_inserter
.
transform
versi yang memutuskan apakah akan menggunakan paralelisme atau tidak. Thetransform
untuk vektor besar gagal.