الدرس 10 من 10
العدّ والترتيب
- 15 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
العدّ بـ std::map والترتيب بـ std::sort ودالة lambda
الشرح
القاموس (map) مثل std::map<std::string, int> يربط كل مفتاح بقيمة، ويبقى مرتّبًا حسب مفاتيحه دائمًا. ويكفي السطر counts[item]++ وحده لعدّ العناصر، لأنّ [] تُنشئ المفتاح غير الموجود بقيمة صفر ثم تزيده. وتمرّ على الأزواج بـ for (const auto& [item, n] : counts) التي تفصل كل زوج إلى مفتاح وقيمة، وauto تستنتج النوع بنفسها، وتأتي الأزواج بترتيب المفاتيح.
وانتبه إلى أنّ [] تُنشئ المفتاح حتى لو كنت تقرأ فقط، فـ if (counts["فأس"] > 0) تضيف «فأس» إلى القاموس بقيمة صفر. ومع const std::map& لا يقبل المترجم [] أصلًا، فاستعمل للقراءة count(key) أو at(key) أو المرور على الأزواج.
وترتّب std::sort(v.begin(), v.end()) من <algorithm> العناصر تصاعديًّا بـ <، ولأي ترتيب آخر أعطها دالة مقارنة. وlambda دالة صغيرة تكتبها في المكان الذي تحتاجها فيه، فـ [](const Player& a, const Player& b) { return a.score > b.score; } تُرجع true إذا كان a يأتي قبل b. ولا تضمن std::sort ترتيب العناصر المتساوية، فإذا أردت ترتيبًا ثابتًا فأضف معيارًا ثانيًا يُستعمل عند التساوي.
المطلوب
أكمل std::map<std::string, int> countLoot(const std::vector<std::string>& drops) لتُرجع عدد مرّات ظهور كل غنيمة، وstd::string mostCommon(const std::map<std::string, int>& counts) لتُرجع الغنيمة الأكثر تكرارًا، والأسبق في ترتيب القاموس عند التساوي، ونصًّا فارغًا إذا كان القاموس فارغًا. ثم أكمل void sortByScore(std::vector<Player>& players) لترتّب اللاعبين في المتّجه نفسه من الأعلى نقاطًا إلى الأدنى، وبالاسم أبجديًّا عند التساوي.
الفحوص
5 فحوص- الدالة countLoot تعدّ كل غنيمة، وتُرجع قاموسًا فارغًا للقائمة الفارغة
- الدالة mostCommon تُرجع الأكثر تكرارًا
- الدالة mostCommon تُرجع الأسبق عند التساوي، ونصًّا فارغًا للقاموس الفارغ
- الدالة sortByScore تضع الأعلى نقاطًا أوّلًا
- الدالة sortByScore ترتّب المتساوين بالاسم أبجديًّا