সম্পাদনা করুন:std::remove
এই উত্তরটি লেখা হওয়ার পরে থেকে ডকুমেন্টেশন ঠিক করা হয়েছে। একই জিনিস প্রযোজ্য list::remove
।
Cpluscplus.com কীভাবে এটি ভুল হতে পারে তা দেখানোর জন্য আমি আপনাকে একটি উদাহরণ দিই।
std::remove
থেকে ফাংশন বিবেচনা করুন <algorithm>
।
সত্যটি হ'ল std::remove
পাত্রে আইটেমটি সরিয়ে নেই। এটি কারণ std::remove
কেবল একজোড়া পুনরাবৃত্তকারীদের সাথে কাজ করে এবং কন্টেইনারটিতে আসলে আইটেমগুলি থাকে সে সম্পর্কে কিছুই জানেন না। প্রকৃতপক্ষে, std::remove
অন্তর্নিহিত ধারকটি সম্পর্কে জানা সম্ভব নয় , কারণ পুনরাবৃত্তকারীরা যে ধারকটির অন্তর্ভুক্ত তা সম্পর্কে কোনও যুগল পুনরুদ্ধারের কাছ থেকে এটি আবিষ্কার করার উপায় নেই। সুতরাং std::remove
সত্যিই আইটেমগুলি সরান না, কেবল কারণ এটি পারে না । কোনও ধারক থেকে আসলে কোনও আইটেম সরিয়ে ফেলার একমাত্র উপায় হ'ল সেই ধারকটিতে সদস্য ফাংশন চাওয়া।
সুতরাং আপনি যদি আইটেমগুলি সরাতে চান, তবে মুছা-সরান আইডিয়ামটি ব্যবহার করুন :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
কিন্তু cplusplus.com
সম্পর্কে ভুল তথ্য দেয় std::remove
। এটা বলে
লক্ষ্য করুন যে এই ফাংশনটি নতুন প্রান্তের অতীতের উপাদানগুলিকে পরিবর্তন করে না , যা তাদের পুরানো মানগুলি রাখে এবং এখনও অ্যাক্সেসযোগ্য ।
যা সঠিক নয়। ব্যাপ্তিটির পুনরাবৃত্তিটি [new_end, old_end)
এখনও অবাস্তব, তবে এর অর্থ এই নয় যে তারা পুরানো মানগুলি রাখে এবং এখনও অ্যাক্সেসযোগ্য। তারা অনির্ধারিত।
একইভাবে, পাশাপাশি ভুল তথ্য cplusplus.com
দেয় । এটি বলে ,list::remove
লক্ষ্য করুন যে একটি গ্লোবাল অ্যালগরিদম ফাংশন, সরান, একই আচরণের সাথে উপস্থিত রয়েছে তবে দুটি পুনরুক্তির মধ্যে অপারেটিং রয়েছে।
যা সম্পূর্ণ ভুল। বিশ্বব্যাপী অপসারণ যথা এর std::remove
মতো নয় list::remove
, যেমন আমরা দেখেছি যে প্রাক্তন আসলেই পাত্রে আইটেমগুলি সরিয়ে দেয় না কারণ এটি পরবর্তীতে (সদস্য ফাংশন) সত্যিই আইটেমগুলি সরিয়ে দেয় কারণ এটি পারে ।
এই উত্তরটি আমার সামান্য পরিবর্তনের সাথে নিম্নলিখিত বিষয়টির উত্তর থেকে অনুলিপি করা হয়েছে:
দ্রষ্টব্য: যেহেতু আমি উপরের বিষয়টিতে উত্তর দিচ্ছিলাম যখনই আমি এটি পেরিয়ে এসেছি, মনে আছে এটি। গত দু'বছর ধরে এমন অনেক ত্রুটি রয়েছে যা আমি মনে করি না। আমি আবার কিছুটা জুড়ে এলে আরও কিছু যুক্ত করতে পারি।