0Pricing
C++ Academy · درس

std::set

عناصر فريدة مرتّبة

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

ما هي std::set؟

تخزن std::set عناصر فريدة بترتيب مرتّب. ولا توجد عناصر مكررة، كما تعمل عمليات البحث في زمن لوغاريتمي.

  • المفاتيح هي القيم نفسها أيضًا.
  • مفيدة جدًا لاختبار العضوية وإزالة التكرارات.
#include <iostream>
#include <set>

int main() {
    std::set<int> s{3, 1, 2, 1, 3};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

إدراج القيم

استخدم insert() لإضافة العناصر. ويُتجاهل ببساطة إدراج قيمة موجودة مسبقًا.

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s;
    s.insert("apple");
    s.insert("banana");
    s.insert("apple");
    std::cout << s.size() << " unique items\n";
    return 0;
}

القيمة المُعادة من insert

تُعيد insert() قيمة من نوع pair، ويشير .second فيها إلى قيمة منطقية تخبرك ما إذا حدث الإدراج فعلًا.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2};
    auto r = s.insert(2);
    std::cout << std::boolalpha << "inserted: " << r.second << '\n';
    auto r2 = s.insert(5);
    std::cout << "inserted: " << r2.second << '\n';
    return 0;
}

التحقق من العضوية

استخدم count() أو contains() في C++20 لاختبار وجود قيمة.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30};
    std::cout << s.count(20) << '\n';
    std::cout << s.count(99) << '\n';
    return 0;
}

العثور على العناصر

تُعيد find() مكررًا إلى العنصر المطابق، أو end() عند غيابه.

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s{"red", "green", "blue"};
    auto it = s.find("green");
    std::cout << (it != s.end() ? "found" : "missing") << '\n';
    return 0;
}

حذف العناصر

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

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3, 4};
    s.erase(3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

الترتيب المرتّب

يُتصفَّح العناصر دائمًا بترتيب تصاعدي، بغض النظر عن ترتيب إدراجها.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{50, 10, 40, 20, 30};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

إزالة التكرارات من البيانات

يُعد إدخال القيم في set طريقة سريعة لإزالة التكرارات وفرز القيم في الوقت نفسه.

#include <iostream>
#include <set>
#include <vector>

int main() {
    std::vector<int> v{4, 2, 4, 1, 2, 3, 1};
    std::set<int> unique(v.begin(), v.end());
    for (int x : unique) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

lower_bound وupper_bound

بما أن set مرتبة، تتيح لك lower_bound() وupper_bound() العثور على النطاقات بكفاءة.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30, 40, 50};
    auto lo = s.lower_bound(20);
    auto hi = s.upper_bound(40);
    for (auto it = lo; it != hi; ++it) std::cout << *it << ' ';
    std::cout << '\n';
    return 0;
}

الحجم والمسح

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

#include <iostream>
#include <set>

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

إدراج نطاق

يمكنك إدراج نطاق كامل من حاوية أخرى، مع إزالة التكرارات وفرز العناصر تلقائيًا.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3};
    int more[] = {3, 4, 5};
    s.insert(more, more + 3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

اختبار سريع

اختبر مدى فهمك لسلوك std::set.

مراجعة

لقد تعلمت أن std::set:

  • تحتوي على قيم فريدة ومرتبة
  • تتجاهل عمليات الإدراج المكررة بصمت
  • تدعم الاستعلامات find وcount وerase وlower_bound/upper_bound المرتبة

بعد ذلك، ستتعرف إلى multimap وmultiset اللتين تسمحان بالتكرارات.

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

هل درس «std::set» مجاني؟

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

ماذا ستتعلم في «std::set»؟

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

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

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

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

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

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

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

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

  1. std::map
  2. std::set
  3. multimap وmultiset
  4. المقارنات المخصّصة
← العودة إلى C++ Academy