إنشاء خريطة
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 24 من 56.
الآن بعد أن فهمت ما هي الخريطة (map)، دعنا نتعلم كيفية إنشاء واحدة وإضافة أزواج مفتاح-قيمة إليها. عند التصريح عن std::map، ستحتاج إلى تحديد كل من نوع المفتاح ونوع القيمة باستخدام الأقواس الزاوية.
إليك الصيغة الأساسية لإنشاء map:
std::map<KeyType, ValueType> mapName;على سبيل المثال، لإنشاء خريطة (map) تخزن أسماء الطلاب كمفاتيح ودرجات اختباراتهم كقيم:
std::map<std::string, int> studentScores;لإضافة عناصر إلى الخريطة (map) الخاصة بك، يمكنك استخدام تدوين الأقواس المربعة مع المفتاح، ثم تعيين قيمة:
studentScores["Alice"] = 95;
studentScores["Bob"] = 87;
studentScores["Carol"] = 92;يؤدي هذا إلى إنشاء ثلاثة أزواج من المفاتيح والقيم في الخريطة. يعمل اسم كل طالب كمفتاح يتيح لك استرجاع درجته المقابلة بسرعة.
لتكرار جميع العناصر في الخريطة (map)، يمكنك استخدام حلقة for المبنية على النطاق (range-based for loop) مع auto. كل عنصر في std::map هو زوج من المفتاح والقيمة، ويمكنك الوصول إلى المفتاح باستخدام .first والقيمة باستخدام .second:
for (const auto& pair : studentScores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}هنا، يقوم auto تلقائياً باستنتاج نوع كل عنصر (زوج مفتاح-قيمة)، ويعطيك pair.first المفتاح (اسم الطالب)، بينما يعطيك pair.second القيمة (الدرجة). لاحظ أن std::map يحافظ تلقائياً على عناصره مرتبة حسب المفتاح، لذا فإن التكرار عبر الخريطة سيطبع المدخلات بترتيب أبجدي.
التحدي
سهلقم بإنشاء برنامج يبني نظاماً لتتبع درجات الطلاب باستخدام std::map. سيقوم برنامجك بتخزين أسماء الطلاب كمفاتيح ودرجات اختباراتهم كقيم.
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد الطلاب - ثم
nمن أزواج المدخلات:- سلسلة نصية تمثل اسم الطالب
- عدد صحيح يمثل درجة الطالب
يجب على برنامجك القيام بما يلي:
- إنشاء
std::map<std::string, int>باسمgrades - قراءة عدد الطلاب
- لكل طالب، اقرأ اسمه ودرجته، ثم أضفهما إلى الخريطة (map) باستخدام تدوين الأقواس المربعة
- بعد إضافة جميع الطلاب، اطبع معلومات كل طالب بالتنسيق الموضح أدناه
- احسب واطبع العدد الإجمالي للطلاب المخزنين في الخريطة
استخدم تنسيق المخرجات الدقيق التالي:
Student Grades:\n[student1]: [score1]\n[student2]: [score2]\n[student3]: [score3]\n...\nTotal students: [number of students]يجب طباعة الطلاب بالترتيب الذي يظهرون به عند التكرار عبر الخريطة (والذي سيكون ترتيباً أبجدياً لأن الخرائط تقوم بالفرز تلقائياً حسب المفتاح). استخدم حلقة for المبنية على النطاق (range-based for loop) للتكرار عبر الخريطة، والوصول إلى كل زوج (مفتاح-قيمة) وطباعة اسم الطالب متبوعاً بدرجته.
جرّب بنفسك
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// قراءة عدد الطلاب
int n;
cin >> n;
// إنشاء الخريطة (map) لتخزين الدرجات
map<string, int> grades;
// TODO: اكتب الكود الخاص بك هنا
// قراءة اسم كل طالب ودرجته، ثم إضافتها إلى الخريطة
// طباعة النتائج
cout << "Student Grades:" << endl;
// TODO: استخدم حلقة for المبنية على النطاق (range-based) لطباعة درجة كل طالب
// طباعة العدد الإجمالي للطلاب
cout << "Total students: " << grades.size() << endl;
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