0Pricing
C++ Academy · درس

std::map

تخزين مرتّب لأزواج المفتاح والقيمة

std::map درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما هي std::map؟

تخزن std::map أزواج المفتاح والقيمة مرتبة حسب المفتاح. ويكون كل مفتاح فريدًا، بينما تعمل عمليات البحث والإدراج والحذف في زمن لوغاريتمي.

  • تُحفظ المفاتيح بترتيب مرتّب.
  • تستند إلى شجرة بحث ثنائية متوازنة.
#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> ages;
    ages["Alice"] = 30;
    ages["Bob"] = 25;
    std::cout << "Alice is " << ages["Alice"] << '\n';
    return 0;
}

إدراج العناصر

يمكنك الإدراج باستخدام operator[] أو insert() أو emplace(). ويؤدي استخدام [] مع مفتاح مفقود إلى إنشائه بقيمة افتراضية.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m;
    m["one"] = 1;
    m.insert({"two", 2});
    m.emplace("three", 3);
    std::cout << m.size() << " entries\n";
    return 0;
}

التكرار بترتيب مرتّب

يؤدي التكرار عبر std::map إلى زيارة المفاتيح بترتيب تصاعدي. ويكون كل عنصر من نوع std::pair، مع .first للمفتاح و.second للقيمة.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"banana", 3}, {"apple", 5}, {"cherry", 1}};
    for (const auto& p : m) {
        std::cout << p.first << " = " << p.second << '\n';
    }
    return 0;
}

العثور على المفاتيح

استخدم find() للبحث الآمن عن مفتاح. فهي تُعيد مكررًا إلى العنصر، أو end() إذا لم تعثر عليه.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"x", 10}, {"y", 20}};
    auto it = m.find("y");
    if (it != m.end()) {
        std::cout << "Found y = " << it->second << '\n';
    } else {
        std::cout << "Not found\n";
    }
    return 0;
}

التحقق من الوجود

لاختبار وجود مفتاح من دون إنشائه، استخدم count() التي تُعيد 0 أو 1، أو استخدم contains() في C++20.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"a", 1}};
    std::cout << m.count("a") << '\n';
    std::cout << m.count("z") << '\n';
    return 0;
}

تحديث القيم

يؤدي إسناد قيمة جديدة إلى مفتاح إلى تحديث قيمته في مكانها. ولا تحتفظ الخريطة إلا بقيمة واحدة لكل مفتاح.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> score;
    score["player"] = 10;
    score["player"] += 5;
    std::cout << score["player"] << '\n';
    return 0;
}

حذف العناصر

تزيل erase() عنصرًا باستخدام مفتاح أو مكرر. وتُعيد عدد العناصر المحذوفة عند تمرير مفتاح إليها.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    m.erase("b");
    std::cout << m.size() << " left\n";
    for (const auto& p : m) std::cout << p.first << ' ';
    std::cout << '\n';
    return 0;
}

استخدام at()

تُعيد at() مرجعًا إلى قيمة مفتاح، وترمي std::out_of_range إذا كان المفتاح مفقودًا. وبخلاف []، لا تُدرج شيئًا مطلقًا.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"k", 42}};
    std::cout << m.at("k") << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

حساب تكرار الكلمات

من الاستخدامات الكلاسيكية لـ std::map حساب التكرارات. ويهيّئ المعامل [] المفاتيح الجديدة افتراضيًا إلى 0، لذلك يعمل ++ مباشرةً.

#include <iostream>
#include <map>
#include <string>

int main() {
    std::string words[] = {"cat", "dog", "cat", "bird", "dog", "cat"};
    std::map<std::string, int> freq;
    for (const auto& w : words) freq[w]++;
    for (const auto& p : freq) std::cout << p.first << ": " << p.second << '\n';
    return 0;
}

الربط البنيوي

يتيح C++17 فك كل زوج باستخدام الربط البنيوي، مما يوفر أسماء واضحة للمفتاح والقيمة.

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"red", 1}, {"green", 2}};
    for (const auto& [name, value] : m) {
        std::cout << name << " -> " << value << '\n';
    }
    return 0;
}

التحقق مما إذا كانت فارغة

تُبلغ empty() عما إذا كانت الخريطة لا تحتوي على عناصر، بينما تزيل clear() كل العناصر دفعةً واحدة.

#include <iostream>
#include <map>

int main() {
    std::map<int, int> m{{1, 1}, {2, 4}};
    std::cout << std::boolalpha << m.empty() << '\n';
    m.clear();
    std::cout << m.empty() << '\n';
    return 0;
}

اختبار سريع

اختبر مدى فهمك لترتيب std::map.

مراجعة

لقد تعلمت أن std::map:

  • تخزن مفاتيح فريدة ومرتبة مرتبطة بقيم
  • تدعم insert و[] وfind وcount وat وerase
  • تكرر العناصر بترتيب تصاعدي للمفاتيح ضمن أزواج يمكنك فكها باستخدام الربط البنيوي

بعد ذلك، ستتعرف إلى std::set لتخزين قيم فريدة ومرتبة فقط.

الأسئلة الشائعة

هل درس «std::map» مجاني؟

نعم — نص درس «std::map» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «std::map»؟

تخزين مرتّب لأزواج المفتاح والقيمة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «std::map»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. std::map
  2. std::set
  3. multimap وmultiset
  4. المقارنات المخصّصة
← العودة إلى C++ Academy