حذف الأزواج
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 27 من 56.
أحياناً تحتاج إلى إزالة أزواج المفتاح والقيمة من الخريطة (map) الخاصة بك عندما لا تعد هناك حاجة إليها. توفر الطريقة .erase() وسيلة مباشرة لحذف العناصر عن طريق تحديد المفتاح الذي تريد إزالته.
لإزالة عنصر من الخريطة (map)، ما عليك سوى استدعاء .erase() مع تمرير المفتاح كمعامل (argument):
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // يزيل إدخال Bob تماماًبعد استدعاء erase("Bob")، ستحتوي الخريطة فقط على درجات Alice و Carol. إذا حاولت مسح مفتاح غير موجود في الخريطة، فإن العملية ببساطة لا تفعل شيئاً - ولا يحدث أي خطأ.
هذه الطريقة مفيدة بشكل خاص للحفاظ على هياكل بيانات نظيفة، أو إزالة المعلومات القديمة، أو تنفيذ ميزات تتيح للمستخدمين حذف المدخلات من تطبيقك.
التحدي
سهلقم بإنشاء برنامج يدير دليل جهات اتصال باستخدام std::map. سيقوم برنامجك بتخزين أسماء جهات الاتصال وأرقام هواتفهم، ثم يسمح للمستخدمين بإزالة جهات اتصال محددة من الدليل باستخدام طريقة .erase().
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد جهات الاتصال الأولية - ثم
nمن أزواج المدخلات:- سلسلة نصية (string) تمثل اسم جهة الاتصال
- سلسلة نصية (string) تمثل رقم الهاتف
- عدد صحيح
mيمثل عدد جهات الاتصال المراد إزالتها - ثم
mمن السلاسل النصية التي تمثل أسماء جهات الاتصال المراد إزالتها
يجب أن يقوم برنامجك بما يلي:
- إنشاء
std::map<std::string, std::string>باسمcontacts - قراءة عدد جهات الاتصال الأولية وملء الخريطة (map) بأسماء جهات الاتصال وأرقام هواتفهم
- طباعة دليل جهات الاتصال الأولي بالتنسيق الموضح أدناه
- قراءة عدد جهات الاتصال المراد إزالتها
- لكل اسم جهة اتصال مطلوب إزالتها، استخدم طريقة
.erase()لإزالتها من الخريطة - طباعة دليل جهات الاتصال المحدث بعد جميع عمليات الإزالة
استخدم تنسيق المخرجات الدقيق التالي:
الدليل الأولي:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...الدليل المحدث بعد عمليات الإزالة:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...إذا أصبح الدليل فارغاً بعد جميع عمليات الإزالة، اطبع:
Updated Contact Directory:
Directory is emptyيجب طباعة جهات الاتصال بالترتيب الذي تظهر به عند التكرار (iterating) عبر الخريطة (الترتيب الأبجدي حسب اسم جهة الاتصال). استخدم حلقة for المبنية على النطاق (range-based for loop) للتكرار عبر الخريطة في المرتين، مع الوصول إلى كل زوج (مفتاح-قيمة) باستخدام pair.first لاسم جهة الاتصال و pair.second لرقم الهاتف. تذكر أن محاولة مسح جهة اتصال غير موجودة لن تتسبب في حدوث خطأ - ستظل الخريطة ببساطة دون تغيير.
ورقة مرجعية
لإزالة العناصر من الخريطة (map)، استخدم الطريقة .erase() مع المفتاح:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores.erase("Bob"); // يزيل إدخال Bob تماماًإذا لم يكن المفتاح موجوداً، فإن .erase() لا تفعل شيئاً ولا يحدث أي خطأ.
جرّب بنفسك
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// قراءة عدد جهات الاتصال الأولية
int n;
cin >> n;
// إنشاء خريطة جهات الاتصال
map<string, string> contacts;
// قراءة جهات الاتصال الأولية
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: إضافة جهة الاتصال إلى الخريطة
}
// طباعة دليل جهات الاتصال الأولي
cout << "Initial Contact Directory:" << endl;
// TODO: طباعة جميع جهات الاتصال باستخدام حلقة for المبنية على النطاق
// قراءة عدد جهات الاتصال المراد إزالتها
int m;
cin >> m;
// إزالة جهات الاتصال
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: إزالة جهة الاتصال باستخدام طريقة .erase()
}
// طباعة الدليل المحدث
cout << "Updated Contact Directory:" << endl;
// TODO: طباعة جهات الاتصال المتبقية أو "Directory is empty" إذا كان فارغاً
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات4الخرائط (أزواج مفتاح-قيمة)
مقدمة إلى std::mapإنشاء خريطةالوصول إلى القيم وتعديلهاالتحقق من وجود المفاتيححذف الأزواجالتكرار عبر الخريطةمراجعة - تكرار الكلمات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector