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::transformunary_opया के आदेश आवेदन की गारंटी नहीं हैbinary_op। किसी फंक्शन को किसी सीक्वेंस-ऑर्डर में लागू करने के लिए या किसी फंक्शन को लागू करने के लिए जो किसी सीक्वेंस के एलिमेंट्स को मॉडिफाई करता हैstd::for_each।
यह संभवतः समानांतर कार्यान्वयन की अनुमति देने के लिए है। हालाँकि तीसरा पैरामीटर std::transformवह है LegacyOutputIteratorजिसके लिए निम्नलिखित पोस्टकंडिशन है ++r:
इसके बाद ऑपरेशन
rको बढ़ाने के लिए आवश्यक नहीं है और पिछले मूल्य की किसी भी प्रतियां कोrअब अनुमेय या वृद्धि योग्य होने की आवश्यकता नहीं है।
तो यह मुझे लगता है कि आउटपुट का असाइनमेंट क्रम में होना चाहिए । क्या उनका सीधा मतलब यह है कि आवेदन के unary_opक्रम से बाहर हो सकता है, और एक अस्थायी स्थान पर संग्रहीत किया जा सकता है, लेकिन आदेश में आउटपुट पर कॉपी किया जाता है? ऐसा कुछ नहीं लगता है जिसे आप कभी करना चाहते हैं।
अधिकांश C ++ पुस्तकालयों ने वास्तव में समानांतर निष्पादकों को अभी तक लागू नहीं किया है, लेकिन Microsoft के पास है। मुझे पूरा यकीन है कि यह प्रासंगिक कोड है, और मुझे लगता है कि यह इस populate()फ़ंक्शन को आउटपुट के चांस को रिकॉर्ड करने के लिए कॉल करता है, जो निश्चित रूप से ऐसा करने के लिए एक वैध बात नहीं है क्योंकि LegacyOutputIteratorइसकी प्रतियां बढ़ाकर अमान्य किया जा सकता है।
मैं क्या खो रहा हूँ?
s, जो पुनरावृत्तियों को अमान्य करता है।
std::transformसटीक नीति के साथ उपयोग करते हैं तो यादृच्छिक अभिगमकर्ता की आवश्यकता होती है जो back_inserterपूरा नहीं कर सकता है। आईएमओ उद्धृत भाग प्रलेखन उस परिदृश्य को संदर्भित करता है। प्रलेखन उपयोग में नोट उदाहरण std::back_inserter।
transformसंस्करण के साथ जो यह तय करता है कि क्या लकवा का उपयोग करना है या नहीं।transformबड़े वैक्टर के लिए विफल रहता है।