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::transformtidak menjamin aplikasiunary_opataubinary_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::transformadalah LegacyOutputIteratoryang memiliki postcondition berikut untuk ++r:
Setelah operasi
rini tidak perlu bertambah dan salinan dari nilai sebelumnyartidak lagi diperlukan untuk dereferensi atau bertambah.
Jadi menurut saya penugasan output harus dilakukan secara berurutan. Apakah mereka hanya berarti bahwa aplikasi unary_opmungkin 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 LegacyOutputIteratordapat dibatalkan dengan menambah salinannya.
Apa yang saya lewatkan?
s, yang membatalkan iterator.
std::transformdengan kebijakan exaction, diperlukan iterator akses acak yang back_insertertidak dapat dipenuhi. Dokumentasi bagian yang dikutip IMO mengacu pada skenario itu. Perhatikan contoh dalam penggunaan dokumentasi std::back_inserter.
transformversi yang memutuskan apakah akan menggunakan paralelisme atau tidak. Thetransformuntuk vektor besar gagal.