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
นี่น่าจะอนุญาตให้มีการใช้งานแบบขนาน อย่างไรก็ตามพารามิเตอร์ที่สามของstd::transform
คือLegacyOutputIterator
ซึ่งมี postcondition ต่อไปนี้สำหรับ++r
:
หลังจากการดำเนินการ
r
นี้ไม่จำเป็นต้องเพิ่มและสำเนาใด ๆ ของค่าก่อนหน้าของr
ไม่จำเป็นต้องถูกยกเลิกหรือเพิ่มเติม
สำหรับฉันแล้วดูเหมือนว่าการกำหนดผลลัพธ์จะต้องเกิดขึ้นตามลำดับ พวกเขาหมายถึงว่าแอปพลิเคชันunary_op
อาจไม่เป็นระเบียบและจัดเก็บในตำแหน่งชั่วคราว แต่คัดลอกไปยังเอาต์พุตตามลำดับหรือไม่ ไม่ได้ดูเหมือนสิ่งที่คุณอยากจะทำ
ไลบรารี C ++ ส่วนใหญ่ยังไม่ได้ใช้ตัวจัดการแบบขนานจริง ๆ แต่ Microsoft มี ผมค่อนข้างมั่นใจว่านี้เป็นรหัสที่เกี่ยวข้องและผมคิดว่ามันสายนี้populate()
ฟังก์ชั่นการบันทึกเพื่อ iterators ชิ้นของการส่งออกซึ่งก็ไม่ได้เป็นสิ่งที่ถูกต้องที่จะทำเพราะ LegacyOutputIterator
สามารถจะถูกยกเลิกโดยการเพิ่มสำเนาของมัน
ฉันกำลังคิดถึงอะไร
s
ซึ่งจะทำให้การทำซ้ำเป็นโมฆะ
std::transform
กับนโยบาย exaction จำเป็นต้องใช้ตัววนซ้ำการเข้าถึงแบบสุ่มซึ่งback_inserter
ไม่สามารถทำได้ เอกสารประกอบชิ้นส่วน IMO ที่ยกมาอ้างถึงสถานการณ์นั้น std::back_inserter
ตัวอย่างเช่นหมายเหตุในการใช้เอกสาร
transform
เวอร์ชันที่ตัดสินใจว่าจะใช้ paralelism หรือไม่transform
สำหรับเวกเตอร์ขนาดใหญ่ล้มเหลว