إبطال مكررات std::vector: شرح تفصيلي
تمت مناقشة مفهوم إبطال المكرر في std::vector بشكل متكرر. للتوضيح، محو العناصر المتجهة عبر std::vector::erase يبطل التكرارات الموضوعة بدقة بعد العنصر الذي تم مسحه.
ومع ذلك، تظل صلاحية المكرر في الموضع الدقيق للعنصر الذي تم مسحه غير مؤكدة. منطقيًا، يمكن للمرء أن يفترض أن هذا المكرِّر يظل صالحًا نظرًا لأن التنفيذ الأساسي للمتجه عادةً ما يقوم بإزاحة العناصر المتبقية لملء المساحة الفارغة. ومع ذلك، فإن السلوك الدقيق واحتمال النتائج غير المحددة أقل تأكيدًا.
خذ بعين الاعتبار المثال التالي، الذي يوضح إزالة الأعداد الصحيحة الفردية من المتجه:
typedef std::vector vectype;
vectype vec;
for (int i = 0; i بينما يبدو أن هذا الرمز يتم تنفيذه دون أخطاء في الممارسة العملية، إلا أن صحته تظل قابلة للنقاش.
تكمن الإجابة في سلوك المسح: فهو يبطل بالفعل جميع التكرارات عند المكرر أو بعده( ق) مرت للمسح. ومع ذلك، فإنه يُرجع أيضًا مكررًا جديدًا مباشرة بعد العنصر (العناصر) الذي تم مسحه أو حتى النهاية في حالة عدم وجود هذا العنصر. يمكن استخدام هذا المكرر لاستئناف التكرار.
من المهم ملاحظة أن الطريقة المذكورة أعلاه لإزالة الأعداد الصحيحة الفردية غير فعالة (O(n2)) لأن كل محو يتطلب نقل الكل العناصر اللاحقة. يوفر مصطلح المسح والإزالة حلاً أكثر كفاءة (O(n)):
bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3