التحقق من وجود المفاتيح
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 26 من 56.
بينما يعد عامل الأقواس المربعة ملائماً للوصول إلى قيم الخريطة (map)، هناك مشكلة محتملة: ماذا يحدث إذا حاولت الوصول إلى مفتاح غير موجود؟ كما تعلمت في الدرس السابق، فإن استخدام [] مع مفتاح غير موجود ينشئ ذلك المفتاح تلقائياً بقيمة افتراضية.
أحياناً قد ترغب في التحقق مما إذا كان المفتاح موجوداً قبل الوصول إليه، دون إنشاء إدخالات جديدة عن طريق الخطأ. هنا تبرز فائدة الطريقة .count()؛ فهي تخبرك ما إذا كان مفتاح معين موجوداً في الخريطة (map).
تُرجع الطريقة .count() القيمة 1 إذا كان المفتاح موجوداً و 0 إذا لم يكن موجوداً:
std::map<std::string, int> scores;
scores["Alice"] = 95;
if (scores.count("Alice")) {
std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
std::cout << "Alice not found" << std::endl;
}يتيح لك هذا النهج التحقق بأمان من وجود مفتاح والتعامل مع كلتا الحالتين بشكل مناسب، مما يمنع إنشاء إدخالات غير مرغوب فيها في الخريطة (map) الخاصة بك.
التحدي
سهلقم بإنشاء برنامج يدير نظام استعارة الكتب في مكتبة باستخدام std::map. سيقوم برنامجك بتتبع الكتب المتاحة واستخدام طريقة .count() للتحقق بأمان مما إذا كانت الكتب موجودة قبل محاولة الوصول إلى معلوماتها.
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد الكتب في المكتبة - ثم
nمن أزواج المدخلات:- سلسلة نصية (string) تمثل عنوان الكتاب
- عدد صحيح يمثل عدد النسخ المتاحة
- عدد صحيح
mيمثل عدد طلبات الكتب المراد التحقق منها - ثم
mمن السلاسل النصية التي تمثل عناوين الكتب للبحث عنها
يجب على برنامجك القيام بما يلي:
- إنشاء
std::map<std::string, int>باسمlibrary - قراءة عدد الكتب وملء الخريطة (map) بعناوين الكتب وعدد نسخها المتاحة
- قراءة عدد طلبات الكتب
- لكل طلب كتاب، استخدم طريقة
.count()للتحقق مما إذا كان الكتاب موجوداً في المكتبة - طباعة الرسالة المناسبة بناءً على ما إذا كان الكتاب موجوداً أم لا
استخدم تنسيق المخرجات الدقيق التالي:
لكل طلب كتاب:
- إذا كان الكتاب موجوداً:
Book "[book title]" is available with [number] copies - إذا لم يكن الكتاب موجوداً:
Book "[book title]" is not available in the library
استخدم طريقة .count() في جملة if للتحقق من وجود الكتاب قبل الوصول إلى قيمته. إذا أعادت library.count(bookTitle) القيمة 1، فهذا يعني أن الكتاب موجود ويمكنك الوصول بأمان إلى library[bookTitle] للحصول على عدد النسخ. أما إذا أعادت 0، فإن الكتاب غير موجود في المكتبة.
ورقة مرجعية
تتحقق الطريقة .count() مما إذا كان المفتاح موجوداً في الخريطة (map) دون إنشاء إدخالات جديدة. وهي تعيد القيمة 1 إذا كان المفتاح موجوداً و 0 إذا لم يكن موجوداً:
std::map<std::string, int> scores;
scores["Alice"] = 95;
if (scores.count("Alice")) {
std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
std::cout << "Alice not found" << std::endl;
}يمنع هذا إنشاء إدخالات غير مرغوب فيها عن طريق الخطأ عند التحقق من وجود المفتاح، على عكس استخدام عامل الأقواس المربعة [] الذي يقوم تلقائياً بإنشاء مفاتيح بقيم افتراضية.
جرّب بنفسك
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// قراءة عدد الكتب
int n;
cin >> n;
// إنشاء خريطة المكتبة
map<string, int> library;
// قراءة معلومات الكتب وتعبئة الخريطة
for (int i = 0; i < n; i++) {
string title;
int copies;
cin >> title >> copies;
library[title] = copies;
}
// قراءة عدد طلبات الكتب
int m;
cin >> m;
// TODO: اكتب كودك أدناه
// معالجة كل طلب كتاب باستخدام طريقة .count()
// تحقق مما إذا كان الكتاب موجوداً واطبع الرسالة المناسبة
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