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