الوصول إلى القيم وتعديلها
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 25 من 56.
بمجرد أن يكون لديك خريطة (map) تحتوي على أزواج من المفاتيح والقيم، ستحتاج غالباً إلى استرداد أو تحديث القيم المخزنة فيها. يوفر عامل الأقواس المربعة [] طريقة ملائمة للوصول إلى القيم الموجودة وتعديلها على حد سواء.
للوصول إلى قيمة، ما عليك سوى استخدام المفتاح داخل أقواس مربعة:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // يحصل على 95تعمل نفس الصيغة لتحديث القيم الموجودة:
scores["Alice"] = 98; // تحديث درجة Alice إلى 98إليك سلوك مهم يجب تذكره: إذا استخدمت عامل [] مع مفتاح غير موجود في الخريطة (map)، فإنه ينشئ تلقائيًا عنصرًا جديدًا بهذا المفتاح ويهيئه بقيمة افتراضية (0 للأعداد الصحيحة، وسلسلة نصية فارغة للسلاسل النصية، وما إلى ذلك).
int bobScore = scores["Bob"]; // ينشئ "Bob" بقيمة 0تجعل ميزة الإنشاء التلقائي هذه المعامل [] مريحاً للغاية لكل من قراءة وكتابة بيانات الخريطة (map data)، حيث لا تحتاج إلى التحقق مما إذا كان المفتاح موجوداً قبل استخدامه.
يمكنك أيضاً التكرار عبر جميع أزواج المفتاح والقيمة في الخريطة (map) باستخدام حلقة for القائمة على النطاق (range-based). كل عنصر في الخريطة هو pair (زوج)، حيث يحتوي pair.first على المفتاح ويحتوي pair.second على القيمة:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}سيؤدي هذا إلى طباعة كل زوج مفتاح-قيمة مخزن في الخريطة، كل واحد في سطر.
التحدي
سهلقم بإنشاء برنامج يدير نظام مخزون المنتجات باستخدام std::map. سيقوم برنامجك بتتبع أسماء المنتجات وكميات المخزون الحالية، مما يتيح لك الوصول إلى مستويات المخزون وتحديثها.
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد المنتجات الأولية - ثم
nمن أزواج المدخلات:- سلسلة نصية (string) تمثل اسم المنتج
- عدد صحيح يمثل كمية المخزون الأولية
- سلسلة نصية تمثل اسم المنتج المراد تحديثه
- عدد صحيح يمثل كمية المخزون الجديدة لهذا المنتج
يجب أن يقوم برنامجك بما يلي:
- إنشاء
std::map<std::string, int>باسمinventory - قراءة عدد المنتجات الأولية
- لكل منتج، قراءة الاسم وكمية المخزون، ثم إضافتهما إلى الخريطة (map) باستخدام تدوين الأقواس المربعة (square bracket notation)
- طباعة المخزون الأولي بالتنسيق الموضح أدناه
- قراءة اسم المنتج والكمية الجديدة للتحديث
- استخدام عامل الأقواس المربعة لتحديث كمية المخزون للمنتج المحدد
- طباعة المخزون المحدث موضحاً مستوى المخزون المعدل
استخدم تنسيق المخرجات الدقيق التالي:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...يجب طباعة المنتجات بالترتيب الذي تظهر به عند التكرار عبر الخريطة (الترتيب الأبجدي حسب اسم المنتج). استخدم حلقة for المبنية على النطاق (range-based for loop) للتكرار عبر الخريطة في المرتين، مع الوصول إلى كل زوج (مفتاح وقيمة) باستخدام pair.first لاسم المنتج و pair.second للكمية. إذا كان اسم المنتج المراد تحديثه غير موجود في الخريطة، فإن عامل الأقواس المربعة سيقوم تلقائياً بإنشاء إدخال جديد بهذا الاسم والكمية المحددة.
ورقة مرجعية
استخدم عامل الأقواس المربعة [] للوصول إلى قيم الخريطة (map) وتعديلها:
std::map<std::string, int> scores;
scores["Alice"] = 95; // تعيين القيمة
int aliceScore = scores["Alice"]; // الحصول على القيمة
scores["Alice"] = 98; // تحديث القيمةإذا استخدمت [] مع مفتاح غير موجود، فسيقوم تلقائيًا بإنشاء عنصر جديد بقيمة افتراضية:
int bobScore = scores["Bob"]; // ينشئ "Bob" بقيمة 0استخدم حلقة for القائمة على النطاق (range-based) للتكرار عبر جميع أزواج المفتاح والقيمة. يحتوي كل زوج على .first للمفتاح و .second للقيمة:
for (auto pair : scores) {
// pair.first = المفتاح (مثلاً "Alice")
// pair.second = القيمة (مثلاً 98)
}جرّب بنفسك
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// قراءة عدد المنتجات الأولية
int n;
cin >> n;
// إنشاء خريطة المخزون
map<string, int> inventory;
// قراءة المنتجات الأولية وكمياتها
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: إضافة المنتج إلى خريطة المخزون
}
// TODO: طباعة المخزون الأولي
// قراءة المنتج المراد تحديثه والكمية الجديدة
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: تحديث كمية المنتج في الخريطة
// 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