إنشاء خريطة
جزء من قسم 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). يعمل اسم كل طالب كمفتاح يتيح لك استرجاع درجته المقابلة بسرعة.
لتكرار جميع الإدخالات في الخريطة (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) للتكرار عبر الخريطة، والوصول إلى كل زوج (مفتاح-قيمة) وطباعة اسم الطالب متبوعاً بدرجته.
ورقة مرجعية
لإنشاء std::map، حدد أنواع المفتاح والقيمة داخل أقواس زاوية:
std::map<KeyType, ValueType> mapName;مثال مع مفاتيح من نوع string وقيم integer:
std::map<std::string, int> studentScores;أضف العناصر باستخدام تدوين الأقواس المربعة:
studentScores["Alice"] = 95;
studentScores["Bob"] = 87;
studentScores["Carol"] = 92;قم بالتكرار عبر الخريطة باستخدام حلقة for القائمة على النطاق. كل عنصر هو عبارة عن زوج (pair) — استخدم .first للوصول إلى المفتاح و .second للوصول إلى القيمة:
for (const auto& pair : studentScores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}يستنتج auto تلقائيًا نوع كل عنصر، ويتجنب const auto& عمليات النسخ غير الضرورية.
جرّب بنفسك
#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