فهم الفرق بين std::erase و std::remove
خوارزمية std::remove هي أداة متعددة الاستخدامات مصممة للعمل على أي زوج مكرر أمامي، مما يجعله قابلاً للتطبيق على نطاق واسع من الحاويات والسيناريوهات. على عكس نظيره std::erase، الذي يحذف ويزيل العناصر من الحاوية بشكل فعال، فإن std::remove يعيد ترتيب العناصر فقط.
1. الكشف عن الفروق الدقيقة في std::remove
std::remove يعمل عن طريق تقسيم الحاوية منطقيًا إلى قسمين: قسم يحتوي على العناصر المراد إزالتها وقسم يحتوي على العناصر المتبقية. يقوم بذلك عن طريق التكرار عبر الحاوية وتحريك العناصر غير المحذوفة للأمام، والكتابة فوق العناصر المحذوفة بشكل فعال. ومع ذلك، من المهم ملاحظة أن std::remove لا يؤدي فعليًا إلى مسح العناصر المحذوفة؛ تظل في الذاكرة ولكنها مخفية بشكل فعال عن العرض.
يصبح هذا السلوك واضحًا عند استخدام std::remove بالتزامن مع وظيفة Container size(). بعد إزالة عنصر باستخدام std::remove، سيستمر std::size() في إرجاع الحجم الأصلي للحاوية، على الرغم من حذف بعض العناصر منطقيًا. يتغير حجم الحاوية فقط بعد استخدام std::erase لإزالة العناصر المخفية فعليًا.
2. تصور تأثير std::remove
ضع في اعتبارك مقتطف الكود المقدم في السؤال الأصلي:
std::vector a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
بعد تنفيذ std::remove، لا يزال المتجه يحتوي على عنصرين (2 و 2)، ولكن العنصر الأول (1) يتم حذفه منطقيًا وإخفائه عن العرض. ولذلك، std::size() ترجع 2، على الرغم من وجود عنصر محذوف مخفي.
3. استخدام std::erase للإزالة الفعلية
لإزالة العناصر المحذوفة فعليًا وتحديث حجم الحاوية، يتم تشغيل std::erase. من خلال استدعاء std::erase مع زوج التكرار الذي تم إرجاعه بواسطة std::remove كوسيطة أولى، يمكنك إزالة العناصر المحذوفة المخفية وتقليل حجم الحاوية:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
في هذه الحالة، std::erase يزيل العنصر 1 فعليًا، ويترك المتجه بعنصر واحد (2) وحجم محدث 1.
4. فهم نطاق الأداة المساعدة std::remove
بينما لم يتم تصميم std::remove فقط لاستخدامه مع std::erase، فإنه يجد استخدامًا واسع النطاق في سيناريوهات مختلفة حيث يتم التقسيم المنطقي لـ std::remove العناصر مطلوبة. على سبيل المثال، يمكنك استخدام std::remove to:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3