0Pricing
C++ Academy · درس

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

جميع الدروس في هذه الدورة

  1. std::unordered_map
  2. unordered_set
  3. دوال التجزئة المخصّصة
  4. اعتبارات الأداء
← العودة إلى C++ Academy