إزالة العناصر
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 16 من 56.
أحياناً تحتاج إلى إزالة عناصر من المتجه (vector) عندما لا تعد هناك حاجة إليها. تتطلب المتجهات (Vectors) استخدام مكرر (iterator) مع التابع .erase(). يمكنك الجمع بين std::find() و .erase() لإزالة العناصر حسب قيمتها.
إليك كيفية إزالة عنصر من متجه (vector):
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // يزيل العنصر عند موضع المكرر (iterator)
}بعد استدعاء erase()، تتم إزالة العنصر الموجود في ذلك الموضع وتنتقل جميع العناصر اللاحقة للأسفل. إذا حاولت العثور على عنصر غير موجود ومسحه، سيعيد find() القيمة end()، والتحقق من ذلك يمنع حدوث الأخطاء.
يجعل هذا النمط عملية إزالة العناصر آمنة وقابلة للتوقع. وهو مفيد بشكل خاص لصيانة المجموعات الديناميكية حيث تحتاج إلى إزالة عناصر محددة بناءً على مدخلات المستخدم أو منطق البرنامج. تذكر دائماً التحقق مما إذا كان المكرر (iterator) صالحاً قبل المسح (erasing).
التحدي
سهلقم بإنشاء برنامج يوضح كيفية إزالة العناصر من std::vector باستخدام طريقة .erase() مدمجة مع std::find(). سيختبر هذا التحدي فهمك لكيفية إزالة عناصر محددة بأمان من المتجه (vector) ومراقبة النتائج.
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد العناصر التي سيتم إضافتها في البداية إلى المتجه - ثم
nمن الأعداد الصحيحة ليتم إدراجها في المتجه - عدد صحيح
mيمثل عدد العناصر المراد إزالتها - ثم
mمن الأعداد الصحيحة التي تمثل العناصر المراد إزالتها من المتجه
يجب على برنامجك القيام بما يلي:
- إنشاء
std::vector<int>فارغ - قراءة عدد العناصر المراد إضافتها وإدراجها في المتجه باستخدام
.push_back() - طباعة حجم المتجه الأولي بعد كل عمليات الإدراج
- قراءة عدد العناصر المراد إزالتها
- لكل عنصر مراد إزالته، استخدم
std::find()لتحديد موقعه، ثم استخدم.erase()لإزالته إذا تم العثور عليه - بعد كل محاولة إزالة، اطبع الحجم الحالي للمتجه
- أخيرًا، قم بالمرور عبر العناصر المتبقية في المتجه واطبعها بالترتيب
استخدم تنسيق المخرجات الدقيق التالي:
حجم المتجه الأولي:
Initial size: [size]بعد كل محاولة إزالة:
After removing [number]: size = [current_size]العناصر المتبقية النهائية:
Remaining elements: [element1] [element2] [element3] ...تذكر أن .erase() يتطلب مكررًا (iterator)، لذا يجب عليك استخدام std::find() أولاً لتحديد موقع العنصر. تحقق دائمًا مما إذا كان العنصر قد تم العثور عليه قبل المسح. استخدم "range-based for loop" لطباعة العناصر المتبقية بترتيبها الحالي.
ورقة مرجعية
استخدم std::find() بالاشتراك مع .erase() لإزالة عنصر محدد من vector:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // يزيل العنصر عند موضع المكرر (iterator)
}تحقق دائماً مما إذا كان المكرر (iterator) لا يساوي end() قبل المسح لتجنب السلوك غير المحدد (undefined behavior). تتطلب الطريقة .erase() مكرراً (iterator)، وليس قيمة بشكل مباشر.
جرّب بنفسك
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// قراءة عدد العناصر المراد إضافتها
int n;
cin >> n;
// إنشاء متجه (vector) فارغ
vector<int> myVector;
// قراءة وإدراج n من العناصر
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// إدراج العنصر في المتجه
}
// قراءة عدد العناصر المراد إزالتها
int m;
cin >> m;
// TODO: اكتب الكود الخاص بك أدناه
// 1. طباعة حجم المتجه الأولي
// 2. لكل عنصر مطلوب إزالته، ابحث عنه واستخدم .erase() واطبع الحجم بعد كل عملية إزالة
// 3. طباعة العناصر المتبقية في المتجه
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector