std::set
المجموعة الفريدة std::set
std::set حاوية تخزّن عناصر فريدة فقط (بلا تكرار) وتحافظ على ترتيبها تلقائيًا — مثالية لفلترة التكرارات أو فحص الانتماء بسرعة.
إدراج عنصر موجود مسبقًا بـ set لا يفعل شيئًا (يبقى نسخة واحدة فقط)، وكل العناصر مرتّبة تلقائيًا بفضل بنيتها الشجرية المشابهة لـ map. مفيدة جدًا لحالات مثل: إزالة التكرارات من قائمة، أو فحص سريع «هل هذا العنصر موجود؟» بسرعة O(log n) بدل المرور الخطي على vector كامل.
الصياغة
std::set<Type> name; name.insert(value); name.count(value);
📄 مثال
#include <set> std::set<int> uniqueNums; uniqueNums.insert(5); uniqueNums.insert(2); uniqueNums.insert(5); // تجاهل — 5 موجود مسبقًا std::cout << uniqueNums.size(); // 2 for (int n : uniqueNums) std::cout << n << " "; // 2 5 — مرتّبة تلقائيًا
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| insert(v) | إضافة عنصر — تُتجاهل صامتة لو كان موجودًا مسبقًا |
| count(v) / find(v) | فحص سريع لوجود عنصر (count تُرجع 0 أو 1 فقط لأن العناصر فريدة) |
| الترتيب التلقائي | العناصر مرتّبة دائمًا تصاعديًا (أو حسب comparator مخصّص) |
💡 نصائح عملية
- استخدمها لإزالة التكرارات من مجموعة بيانات بسطر واحد: std::set<T> s(v.begin(), v.end())
- إن لم تحتج الترتيب التلقائي وأردت أقصى سرعة، استخدم std::unordered_set بدلًا منها
⚠️ أخطاء شائعة
- توقّع أن insert() تسمح بعناصر مكرّرة كأنها vector — set تتجاهل صامتة أي عنصر مكرّر فعليًا
- استخدام set لبيانات تحتاج تكرارًا فعليًا للعناصر — الخيار الخطأ هنا، الحل هو vector أو multiset
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.