std::unordered_map
بحث سريع قائم على التجزئة
std::unordered_map درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما هي unordered_map؟
تخزن std::unordered_map أزواج المفاتيح والقيم في جدول تجزئة. وتتم عمليات البحث والإدراج والحذف بوقت ثابت في المتوسط، لكن العناصر لا تملك ترتيباً محدداً.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> ages;
ages["Alice"] = 30;
ages["Bob"] = 25;
std::cout << ages["Alice"] << '\n';
return 0;
}map مقابل unordered_map
اختر وفقاً لاحتياجاتك:
map: مرتبة، وعملياتها بتعقيد O(log n).unordered_map: غير مرتبة، وعملياتها بتعقيد O(1) في المتوسط.
استخدم unordered_map عندما تحتاج فقط إلى عمليات بحث سريعة.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
std::cout << m.size() << " entries (order not guaranteed)\n";
return 0;
}الإدراج والتحديث
لها واجهة API نفسها الموجودة في map: استخدم [] أو insert() أو emplace().
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m;
m["x"] = 1;
m.insert({"y", 2});
m.emplace("z", 3);
std::cout << m.size() << '\n';
return 0;
}البحث باستخدام find
تعيد find() مكرراً أو end(). ويجنبك ذلك إدراج قيمة افتراضية عن طريق الخطأ كما يحدث مع [].
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}};
auto it = m.find("a");
if (it != m.end()) std::cout << it->second << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}التحقق من الوجود
تعيد count() القيمة 0 أو 1، ويضيف C++20 الدالة contains() لإجراء تحقق واضح بقيمة منطقية.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"key", 99}};
std::cout << m.count("key") << '\n';
std::cout << m.count("missing") << '\n';
return 0;
}التكرار
يمكنك التكرار على العناصر، لكن الترتيب غير محدد. لا تفترض أبداً أنه مرتب أو يتبع ترتيب الإدراج.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
int total = 0;
for (const auto& [k, v] : m) total += v;
std::cout << "sum = " << total << '\n';
return 0;
}الحذف
تزيل erase() العناصر حسب المفتاح، وتعيد عدد العناصر المحذوفة.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
m.erase("a");
std::cout << m.count("a") << ' ' << m.size() << '\n';
return 0;
}عدّ التكرارات بسرعة
بالنسبة إلى مجموعات البيانات الكبيرة التي لا يهم ترتيبها، تحسب unordered_map التكرارات بسرعة أكبر من map.
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::string items[] = {"a", "b", "a", "c", "b", "a"};
std::unordered_map<std::string, int> freq;
for (const auto& s : items) freq[s]++;
std::cout << "a appears " << freq["a"] << " times\n";
return 0;
}استخدام at()
تعيد at() مرجعاً، وتطلق الاستثناء std::out_of_range عند غياب المفتاح، ولا تُدرج أي عنصر مطلقاً.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m{{"score", 42}};
std::cout << m.at("score") << '\n';
return 0;
}الإدراج الافتراضي عبر []
يؤدي الوصول إلى مفتاح مفقود باستخدام [] إلى إدراجه بقيمة مهيأة بالقيمة الافتراضية، وهي 0 للأعداد الصحيحة. انتبه، فهذا يزيد حجم map بصمت.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> m;
std::cout << m["new"] << '\n';
std::cout << "size: " << m.size() << '\n';
return 0;
}تفريغ map
تفرغ clear() الجدول، وتُبلغ empty() عما إذا كان لا يحتوي على أي عناصر.
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, int> m{{1, 1}, {2, 2}};
m.clear();
std::cout << std::boolalpha << m.empty() << '\n';
return 0;
}تحقق سريع
اختبر مدى فهمك لترتيب unordered_map.
مراجعة
تعلمت أن std::unordered_map:
- تستخدم جدول تجزئة لتنفيذ العمليات بوقت O(1) في المتوسط
- لا تملك ترتيباً مضموناً
- تشترك في واجهة API نفسها مع
map، بما في ذلكfindوcountوatوerase
بعد ذلك، سترى unordered_set لتخزين العناصر الفريدة بسرعة.
الأسئلة الشائعة
هل درس «std::unordered_map» مجاني؟
نعم — نص درس «std::unordered_map» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «std::unordered_map»؟
بحث سريع قائم على التجزئة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «std::unordered_map»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- std::unordered_map
- unordered_set
- دوال التجزئة المخصّصة
- اعتبارات الأداء