Cppreferences এর জন্য এই উদাহরণ কোডটি রয়েছে 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
এর জন্য নিম্নলিখিত পোস্টকন্ডিশন রয়েছে ++r
:
এই ক্রিয়াকলাপের পরে
r
ইনক্রিমেন্টেবল হওয়ার প্রয়োজন হয় না এবং এর আগের মানটির কোনও অনুলিপিr
আর আর ডিফারেন্সযোগ্য বা ইনক্রিমেন্টেবল হয় না।
সুতরাং এটি আমার কাছে মনে হচ্ছে আউটপুট বরাদ্দ অবশ্যই অবশ্যই ঘটবে। এগুলির কি সহজভাবে বোঝায় যে প্রয়োগটি প্রয়োগের unary_op
বাইরে চলে যেতে পারে এবং অস্থায়ী স্থানে সঞ্চিত হতে পারে তবে আউটপুটটিকে ক্রমে অনুলিপি করা হয়েছে? এটি এমন কিছু শোনাচ্ছে না যা আপনি কখনও করতে চান ever
বেশিরভাগ সি ++ গ্রন্থাগারগুলি আসলে সমান্তরাল এক্সিকিউটিউটর এখনও বাস্তবায়ন করতে পারেনি, তবে মাইক্রোসফ্ট করেছে। আমি নিশ্চিত এই প্রাসঙ্গিক কোড, এবং আমি মনে করি এটা কল এই populate()
ফাংশন আউটপুট, যা নিশ্চয় কারণ করতে একটি বৈধ জিনিস না এর অংশ রেকর্ড iterators করার LegacyOutputIterator
এটা কপি বৃদ্ধিশীল দ্বারা invalidated করা যেতে পারে।
আমি কী মিস করছি?
s
যা পুনরাবৃত্তিকারীদের অবৈধ করে।
std::transform
নিষেধাজ্ঞার নীতিটি ব্যবহার করেন তবে এলোমেলো অ্যাক্সেসের পুনরুদ্ধারের প্রয়োজন যা back_inserter
পূরণ করতে পারে না। আইএমও উদ্ধৃত অংশ ডকুমেন্টেশন সেই দৃশ্যের উল্লেখ করে। নথি ব্যবহারের ক্ষেত্রে নোট উদাহরণ std::back_inserter
।
transform
সংস্করণ সহ যা প্যারালাইলিজম ব্যবহার করবেন কি না তা স্থির করে।transform
বড় ভেক্টরের জন্য ব্যর্থ।