"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يترك draw-remove_if وراءه أزواجًا مكررة عند إزالة العناصر من `std::vector`؟

لماذا يترك draw-remove_if وراءه أزواجًا مكررة عند إزالة العناصر من `std::vector`؟

تم النشر بتاريخ 2024-12-23
تصفح:136

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

مصطلح Erase-Remove_if لإزالة الزوج

عند محاولة استخدام مصطلح draw-remove_if لإزالة الأزواج من std::vector>، تنشأ مشكلة غريبة. على الرغم من استهداف الأزواج بقيمة .first 4 للإزالة، فإن التنفيذ الأولي يترك وراءه زوجًا مكررًا:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

يكمن جذر المشكلة في عملية المحو غير الكاملة. std::erase_if ينقل العناصر المطابقة إلى نهاية المتجه فقط؛ لا يزيلهم. لإكمال الإزالة، الطريقة الصحيحة هي استخدام المكرر الذي تم إرجاعه بواسطة std::remove_if كنقطة بداية للمسح:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

فهم آلية المسح والإزالة:

  • تبديل العناصر: std::remove_if مبادلة العناصر داخل المتجه، مما يدفع جميع العناصر غير المتطابقة نحو البداية. تنتهي العناصر المتطابقة في الجزء الخلفي من المتجه.
  • التكرار المسند: يحدد تعبير لامدا المسند العناصر التي سيتم إزالتها. إذا كان المسند صحيحًا، فسيتم نقل العنصر المقابل إلى نهاية المتجه.
  • Iterator Retrieval: std::remove_if يُرجع مكررًا يشير إلى العنصر الأول المطابق للمسند؛ يمثل هذا المكرر بداية العناصر المراد إزالتها.
  • مسح المتجهات: std::vector::erase يستدعي عملية محو النطاق، بدءًا من المكرر الذي تم إرجاعه ويمتد إلى المتجه نهاية. تؤدي هذه الخطوة إلى إزالة جميع العناصر المطابقة من المتجه.

لمزيد من الأفكار، ارجع إلى مقالة ويكيبيديا حول [Erase-Remove Idiom](https://en.wikipedia.org/ wiki/Erase-remove_idiom).

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3