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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.