التكرار عبر الخريطة
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 28 من 56.
الآن بعد أن عرفت كيفية إنشاء العناصر وتعديلها وإزالتها من الخريطة (map)، دعنا نتعلم كيفية المرور عبر جميع أزواج المفتاح والقيمة في خريطتك. توفر حلقة for المبنية على النطاق (range-based for loop) طريقة أنيقة للتكرار عبر كل عنصر في std::map.
إليك الصيغة الأساسية للتكرار عبر عناصر الخريطة (map):
for (auto pair : myMap) {
// الوصول إلى المفتاح باستخدام pair.first
// الوصول إلى القيمة باستخدام pair.second
}كل عنصر في الحلقة التكرارية هو كائن من النوع pair يحتوي على عضوين مهمين: first يحمل المفتاح، و second يحمل القيمة. إليك مثال عملي:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}سيقوم هذا بطباعة اسم كل طالب متبوعاً بدرجته. الكلمة المفتاحية auto تحدد تلقائياً النوع الصحيح لكل زوج، مما يجعل الكود الخاص بك أكثر نظافة وأسهل في القراءة.
التحدي
سهلقم بإنشاء برنامج يدير نظام قائمة مطعم باستخدام std::map. سيقوم برنامجك بتخزين أصناف القائمة وأسعارها، ثم عرض القائمة الكاملة من خلال التكرار عبر جميع أزواج المفتاح والقيمة (key-value pairs).
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد أصناف القائمة - ثم
nمن أزواج المدخلات:- سلسلة نصية (string) تمثل اسم الطبق
- رقم عشري (double) يمثل سعر الطبق
يجب على برنامجك القيام بما يلي:
- إنشاء
std::map<std::string, double>باسمmenu - قراءة عدد أصناف القائمة
- لكل صنف في القائمة، اقرأ اسم الطبق وسعره، ثم أضفهما إلى الخريطة (map) باستخدام تدوين الأقواس المربعة (square bracket notation)
- استخدام حلقة (range-based for loop) للتكرار عبر الخريطة بأكملها وطباعة كل طبق مع سعره
- حساب وطباعة العدد الإجمالي للأصناف في القائمة
استخدم تنسيق المخرجات الدقيق التالي:
Restaurant Menu:
[dish1]: $[price1]
[dish2]: $[price2]
[dish3]: $[price3]
...
Total menu items: [number of items]يجب طباعة أصناف القائمة بالترتيب الذي تظهر به عند التكرار عبر الخريطة (الترتيب الأبجدي حسب اسم الطبق). استخدم حلقة (range-based for loop) مع auto pair : menu للتكرار عبر الخريطة، والوصول إلى كل زوج مفتاح وقيمة باستخدام pair.first لاسم الطبق و pair.second للسعر. اطبع كل سعر بمنزلتين عشريتين بالضبط باستخدام std::fixed و std::setprecision(2).
ورقة مرجعية
استخدم حلقة for المبنية على النطاق (range-based for loop) للتكرار عبر جميع أزواج المفتاح والقيمة في std::map:
for (auto pair : myMap) {
// الوصول إلى المفتاح باستخدام pair.first
// الوصول إلى القيمة باستخدام pair.second
}كل عنصر هو كائن زوج (pair object) حيث يحمل first المفتاح ويحمل second القيمة:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}تحدد الكلمة المفتاحية auto تلقائيًا النوع الصحيح لكل زوج.
جرّب بنفسك
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
using namespace std;
int main() {
// قراءة عدد عناصر القائمة
int n;
cin >> n;
// إنشاء خريطة القائمة
map<string, double> menu;
// قراءة عناصر القائمة وأسعارها
for (int i = 0; i < n; i++) {
string dish;
double price;
cin >> dish >> price;
// TODO: أضف الطبق والسعر إلى خريطة القائمة
}
// TODO: اطبع ترويسة "Restaurant Menu:"
// TODO: استخدم حلقة for المبنية على النطاق للمرور عبر القائمة وطباعة كل عنصر
// التنسيق: [dish]: $[price] مع منزلتين عشريتين
// TODO: اطبع العدد الإجمالي لعناصر القائمة
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