0Pricing
C++ Academy · درس

unordered_set

عناصر فريدة قائمة على التجزئة

unordered_set درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما هي unordered_set؟

تخزن std::unordered_set عناصر فريدة في جدول تجزئة. وتتم اختبارات العضوية بوقت ثابت في المتوسط، لكن لا يوجد ترتيب مرتب.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3, 2, 1};
    std::cout << s.size() << " unique values\n";
    return 0;
}

set مقابل unordered_set

كما في map:

  • set: مرتبة، وعملياتها بتعقيد O(log n).
  • unordered_set: غير مرتبة، وعملياتها بتعقيد O(1) في المتوسط.

اختر unordered_set لإجراء أسرع اختبارات العضوية.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> seen{"a", "b", "c"};
    std::cout << (seen.count("b") ? "yes" : "no") << '\n';
    return 0;
}

إدراج القيم

تضيف insert() عنصراً، وتتجاهله إذا كان موجوداً مسبقاً، وتعيد زوجاً يخبرك العنصر .second فيه بما إذا تمت الإضافة.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s;
    auto a = s.insert(5);
    auto b = s.insert(5);
    std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
    return 0;
}

اختبارات العضوية السريعة

يُعد التحقق من أنك رأيت قيمة من قبل حالة الاستخدام الكلاسيكية. تعيد count() القيمة 0 أو 1.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> blocked{"spam", "junk"};
    std::cout << blocked.count("spam") << '\n';
    std::cout << blocked.count("ok") << '\n';
    return 0;
}

حذف العناصر

تزيل erase() قيمة، وتعيد عدد القيم المحذوفة، وهو 0 أو 1.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.erase(2);
    std::cout << "count 2: " << s.count(2) << '\n';
    std::cout << "size: " << s.size() << '\n';
    return 0;
}

اكتشاف التكرارات

يمكنك اكتشاف أول عنصر مكرر في تدفق من خلال إدراجه والتحقق من النتيجة المنطقية.

#include <iostream>
#include <unordered_set>

int main() {
    int data[] = {3, 7, 1, 7, 9};
    std::unordered_set<int> seen;
    for (int x : data) {
        if (!seen.insert(x).second) {
            std::cout << "first duplicate: " << x << '\n';
            break;
        }
    }
    return 0;
}

التكرار

يعمل التكرار، لكن الترتيب غير محدد. اجمع العناصر أو عالجها من دون افتراض أي تسلسل معين.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{10, 20, 30};
    int total = 0;
    for (int x : s) total += x;
    std::cout << "sum = " << total << '\n';
    return 0;
}

إزالة التكرارات من نطاق

أنشئ unordered_set من نطاق لإزالة التكرارات بسرعة، مع العلم أن الترتيب لا يُحفظ.

#include <iostream>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 2, 3, 3, 3};
    std::unordered_set<int> u(v.begin(), v.end());
    std::cout << u.size() << " unique\n";
    return 0;
}

find مقابل count

تمنحك find() مكرراً إلى العنصر كي تتمكن من استخدامه لاحقاً، بينما تُبلغ count() عن وجوده فقط.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> s{"alpha", "beta"};
    auto it = s.find("beta");
    std::cout << (it != s.end() ? *it : "none") << '\n';
    return 0;
}

التفريغ والتحقق من الفراغ

تزيل clear() جميع العناصر، وتتحقق empty() من عدم وجود أي عنصر.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.clear();
    std::cout << std::boolalpha << s.empty() << '\n';
    return 0;
}

تقاطع المجموعات

للعثور على العناصر المشتركة، تكرّر على إحدى المجموعتين وتتحقق من العضوية في المجموعة الأخرى.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> a{1, 2, 3, 4};
    std::unordered_set<int> b{3, 4, 5};
    for (int x : a) if (b.count(x)) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

تحقق سريع

اختبر مدى فهمك لـ unordered_set.

مراجعة

تعلمت أن std::unordered_set:

  • تخزن عناصر فريدة مع تنفيذ العمليات بوقت O(1) في المتوسط
  • لا تملك ترتيباً مضموناً
  • مثالية لاختبارات العضوية السريعة واكتشاف التكرارات

بعد ذلك، ستتعلم كيفية تجزئة الأنواع المخصصة الخاصة بك.

الأسئلة الشائعة

هل درس «unordered_set» مجاني؟

نعم — نص درس «unordered_set» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «unordered_set»؟

عناصر فريدة قائمة على التجزئة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «unordered_set»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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