الوصول إلى القيم وتعديلها
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 25 من 56.
بمجرد أن يكون لديك خريطة تحتوي على أزواج من المفاتيح والقيم، ستحتاج غالباً إلى استرداد أو تحديث القيم المخزنة فيها. يوفر عامل الأقواس المربعة [] طريقة ملائمة للوصول إلى القيم الموجودة وتعديلها.
للوصول إلى قيمة، ما عليك سوى استخدام المفتاح داخل أقواس مربعة:
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 للكمية. إذا كان اسم المنتج المراد تحديثه غير موجود في الخريطة، فإن عامل الأقواس المربعة سيقوم تلقائياً بإنشاء إدخال جديد بهذا الاسم والكمية المحددة.
جرّب بنفسك
#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