الدرس 10 من 10

العدّ والترتيب

هدف الدرس

std::map و std::sort بـ lambda

01

الشرح

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 لا تضمن ترتيب المتساويين، فإن أردت ترتيبًا ثابتًا فأضف معيارًا ثانيًا للتساوي.

02

المطلوب

أكمل 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 معايير
  1. countLoot تعدّ كل غنيمة، والقائمة الفارغة خريطة فارغة
  2. mostCommon تُرجع الأكثر تكرارًا
  3. mostCommon: الأسبق عند التساوي، ونصّ فارغ للفارغة
  4. sortByScore: الأعلى نقاطًا أوّلًا
  5. sortByScore: المتساوون بالاسم أبجديًّا
main.cpp
المخرجاتC++17 · GCC 9 · Judge0

يُترجَم الكود ويعمل على السيرفر…

–/5

يُترجَم الكود ويعمل على السيرفر…

5 معايير في بطاقة «المطلوب».