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