إزالة العناصر
جزء من قسم المنطق وتدفق التنفيذ في رحلة C++ على Coddy. الدرس 16 من 56.
أحيانًا تحتاج إلى إزالة عناصر من متجه عندما لا تعود بحاجة إليها. تتطلب المتجهات استخدام مكرّر مع الطريقة .erase(). يمكنك دمج std::find() مع .erase() لإزالة العناصر حسب قيمتها.
إليك كيفية إزالة عنصر من متجه. تأتي std::find() من الترويسة <algorithm>، لذا أدرجها مع <vector>:
#include <algorithm>
#include <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); // يزيل العنصر الموجود عند موضع المكرّر
}بعد استدعاء erase()، يُزال العنصر في ذلك الموضع وتتحرك جميع العناصر اللاحقة إلى الأسفل. إذا حاولت العثور على عنصر غير موجود ومحوِه، فستُعيد find() القيمة end()، والتحقق من ذلك يمنع الأخطاء.
يجعل هذا النمط إزالة العناصر آمنة ويمكن التنبؤ بها. وهو مفيد بشكل خاص للحفاظ على المجموعات الديناميكية التي تحتاج فيها إلى إزالة عناصر محددة بناءً على إدخال المستخدم أو منطق البرنامج. تذكّر أن تتحقق دائمًا من صلاحية المكرّر قبل الحذف.
التحدي
سهلأنشئ برنامجًا يوضّح إزالة العناصر من std::vector باستخدام الطريقة .erase() مع std::find(). سيختبر هذا التحدي فهمك لكيفية إزالة عناصر محددة بأمان من متجه وملاحظة النتائج.
ستُقدَّم المدخلات التالية:
- عدد صحيح
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() تتطلب مكرّرًا، لذا يجب أن تستخدم std::find() أولًا للعثور على العنصر. تحقّق دائمًا مما إذا كان قد عُثر على العنصر قبل حذفه. استخدم حلقة for مبنية على النطاق لطباعة العناصر المتبقية بترتيبها الحالي.
جرّب بنفسك
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// اقرأ عدد العناصر المراد إضافتها
int n;
cin >> n;
// أنشئ متجهًا فارغًا
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vectorتدرّب بنفسك: مترجم C++ عبر الإنترنت