multimap وmultiset
اسمح بالمفاتيح المكررة
multimap وmultiset درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
السماح بالتكرارات
يشبه std::multimap وstd::multiset كلاً من map وset، لكنهما يسمحان بالمفاتيح المكررة. وتظل جميع العناصر مرتبة.
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms{1, 2, 2, 3, 3, 3};
for (int x : ms) std::cout << x << ' ';
std::cout << '\n';
return 0;
}إدراج multiset
تنجح كل عملية insert() في multiset، حتى عند إدراج قيم مكررة، فتزداد الحاوية في كل مرة.
#include <iostream>
#include <set>
int main() {
std::multiset<std::string> ms;
ms.insert("a");
ms.insert("a");
ms.insert("a");
std::cout << ms.size() << " elements\n";
return 0;
}عدّ التكرارات
تعيد count() الآن عدد مرات ظهور القيمة، وقد يكون العدد أكبر من 1.
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms{5, 5, 5, 7, 9, 9};
std::cout << "5 appears " << ms.count(5) << " times\n";
std::cout << "9 appears " << ms.count(9) << " times\n";
return 0;
}حذف الكل مقابل حذف عنصر واحد
تزيل erase(key) كل العناصر المطابقة. ولإزالة عنصر واحد فقط، احذف مكرراً واحداً باستخدام find().
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms{1, 2, 2, 2, 3};
ms.erase(ms.find(2));
std::cout << "count of 2: " << ms.count(2) << '\n';
return 0;
}أساسيات multimap
يربط std::multimap المفاتيح بالقيم، لكنه يسمح بربط مفتاح واحد بعدة قيم. ملاحظة: لا يحتوي على أي operator[].
#include <iostream>
#include <map>
int main() {
std::multimap<std::string, int> mm;
mm.insert({"fruit", 1});
mm.insert({"fruit", 2});
mm.insert({"veg", 3});
std::cout << mm.size() << " pairs\n";
return 0;
}التكرار على multimap
يعرض التكرار جميع الأزواج بترتيب المفاتيح، بما في ذلك المفاتيح المكررة.
#include <iostream>
#include <map>
int main() {
std::multimap<std::string, int> mm{{"a", 1}, {"a", 2}, {"b", 3}};
for (const auto& [k, v] : mm) {
std::cout << k << " => " << v << '\n';
}
return 0;
}equal_range
تعيد equal_range(key) زوجاً من المكررات يحددان جميع العناصر التي تحمل ذلك المفتاح، وهي الطريقة القياسية لقراءة كل قيمة مرتبطة بمفتاح.
#include <iostream>
#include <map>
int main() {
std::multimap<std::string, int> mm{{"x", 10}, {"x", 20}, {"y", 30}};
auto range = mm.equal_range("x");
for (auto it = range.first; it != range.second; ++it) {
std::cout << it->second << ' ';
}
std::cout << '\n';
return 0;
}تجميع البيانات
تُعد multimap مثالية للتجميع؛ فمثلاً يمكن لعدة أشخاص مشاركة المدينة نفسها.
#include <iostream>
#include <map>
int main() {
std::multimap<std::string, std::string> byCity{
{"NYC", "Alice"}, {"NYC", "Bob"}, {"LA", "Carol"}
};
auto r = byCity.equal_range("NYC");
for (auto it = r.first; it != r.second; ++it)
std::cout << it->second << '\n';
return 0;
}lower_bound على multiset
تظل استعلامات النطاق المرتبة تعمل. إذ يعثر lower_bound على أول عنصر لا يقل عن القيمة المستهدفة.
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms{1, 2, 2, 3, 4};
auto it = ms.lower_bound(2);
std::cout << "first >= 2 is " << *it << '\n';
return 0;
}قائمة التكرارات المرتبة
بما أن العناصر تظل مرتبة، تنتج multiset مخرجات مرتبة تلقائياً مع الحفاظ على التكرارات.
#include <iostream>
#include <set>
int main() {
std::multiset<int> scores{90, 75, 90, 60, 75, 90};
for (int s : scores) std::cout << s << ' ';
std::cout << '\n';
return 0;
}الإجمالي مقابل المميز
تحسب size() كل عنصر، بما في ذلك العناصر المكررة، بينما يتطلب التكرار على المفاتيح المميزة تخطي التكرارات بنفسك.
#include <iostream>
#include <set>
int main() {
std::multiset<int> ms{1, 1, 2, 3, 3};
std::cout << "total: " << ms.size() << '\n';
std::cout << "count of 1: " << ms.count(1) << '\n';
return 0;
}تحقق سريع
اختبر مدى فهمك لحذف العناصر من multiset.
مراجعة
تعلمت أن multimap وmultiset:
- تسمحان بـالمفاتيح المكررة مع الحفاظ على الترتيب
- تستخدمان
equal_rangeلقراءة جميع القيم التي تشترك في مفتاح - تجعلان
erase(key)تزيل كل العناصر المطابقة، بينما تؤدي إزالة مكرر إلى حذف عنصر واحد
بعد ذلك، ستتحكم في الترتيب باستخدام مقارنات مخصصة.
الأسئلة الشائعة
هل درس «multimap وmultiset» مجاني؟
نعم — نص درس «multimap وmultiset» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «multimap وmultiset»؟
اسمح بالمفاتيح المكررة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «multimap وmultiset»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- std::map
- std::set
- multimap وmultiset
- المقارنات المخصّصة