Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الوصول إلى القيم وتعديلها

جزء من قسم 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;
}

سيؤدي هذا إلى طباعة كل زوج مفتاح-قيمة مخزن في الخريطة، كل واحد في سطر.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام مخزون المنتجات باستخدام std::map. سيقوم برنامجك بتتبع أسماء المنتجات وكميات المخزون الحالية، مما يتيح لك الوصول إلى مستويات المخزون وتحديثها.

سيتم توفير المدخلات التالية:

  • عدد صحيح n يمثل عدد المنتجات الأولية
  • ثم n من أزواج المدخلات:
    • سلسلة نصية (string) تمثل اسم المنتج
    • عدد صحيح يمثل كمية المخزون الأولية
  • سلسلة نصية تمثل اسم المنتج المراد تحديثه
  • عدد صحيح يمثل كمية المخزون الجديدة لهذا المنتج

يجب أن يقوم برنامجك بما يلي:

  1. إنشاء std::map<std::string, int> باسم inventory
  2. قراءة عدد المنتجات الأولية
  3. لكل منتج، قراءة الاسم وكمية المخزون، ثم إضافتهما إلى الخريطة (map) باستخدام تدوين الأقواس المربعة (square bracket notation)
  4. طباعة المخزون الأولي بالتنسيق الموضح أدناه
  5. قراءة اسم المنتج والكمية الجديدة للتحديث
  6. استخدام عامل الأقواس المربعة لتحديث كمية المخزون للمنتج المحدد
  7. طباعة المخزون المحدث موضحاً مستوى المخزون المعدل

استخدم تنسيق المخرجات الدقيق التالي:

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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow