ما هي حاوية Set في لغة ++C؟
(set) هي عبارة عن حاوية ترابطية (أي ترتبط كل قيمة بمفتاح)، وتحتوي (set) على مجموعة مرتبة من العناصر الفريدة وتكون من نوع المفتاح، يظهر كل عنصر مرة واحدة فقط، لذلك فهي لا تسمح بالتكرارات، و إذا أُدخل عنصر إلى حاوية (set) لا يمكن التعديل على قيمته، أي أن العناصر دائمًا ثابتة (const)، ولكن يمكن إدخالها أو إزالتها من الحاوية، وتكون حاويات (set) بشكل عام أبطأ من (unordered_set)، في الوصول إلى العناصر بشكل فردي عن طريق مفتاحه.
أهم الدوال في الـ Set:
الدالة | استخدامها | تعقيد الوقت |
1- ()begin | يُرجع (Return) مؤشر يشير إلى موقع أول عنصر في (set)، وتستطيع من خلاله التنقل عبر محتويات (set). | (1)O |
2- ()end | يُرجع مؤشر يشير إلى موقع الذي يتبع العنصر الأخير في (set)، بالتالي لا يشير إلى أي عنصر في (set). | O(1) |
3- ()rbegin | يرجع مؤشر يشير إلى موقع العنصر الأخير في (set)، ويعني (reverse begin) أي بداية عكسية. | O(1) |
4- ()rend | يرجع مؤشر يشير إلى موقع الذي يسبق أول عنصر في (set)، بالتالي لا يشير إلى أي عنصر في (set)، ويعني (reverse end) أي نهاية عكسية. | O(1) |
5- (Val)insert | توسيع حاوية (set)،عن طريق إدخال عناصر جديدة، نظرًا لأن العناصر الموجودة في (set) يجب أن تكون فريدة، فإن عملية الإدراج تتحقق مما إذا كان كل العنصر مدرج مكافئًا لعنصر موجود بالفعل في الحاوية، وإذا كان الأمر كذلك، فلن يتم إدراج العنصر. داخليًا، تُبقي هذه الدالة جميع العناصر داخل (set) مرتبة، وفقًا للمعيار المحدد بواسطة، ويتم دائمًا إدراج العناصر في موضعها الخاص بعد هذا الترتيب. | (O(N*log(N) حيث أن (N) هي عدد العناصر المُدخلة ل (set) |
6- (x)swap | يستبدل محتوى (set) التي يتم الاستدعاء بها بمحتوى (x)، وهي (set) أخرى، ويجب أن تكون من نفس النوع، وقد تختلف الأحجام. بعد استدعاء هذه الدالة، تكون العناصر الموجودة في (set) التي تم الاستدعاء بها، هي العناصر التي كانت موجودة في (x) قبل الاستدعاء، وعناصر الموجودة في (x) هي العناصر التي كانت الموجودة في (set) التي تم الاستدعاء بها. | O(1) |
7- ()clear | يزيل جميع العناصر من الحاوية، فيصبح حجم الحاوية (0). | O(N) |
8- ()empty | تختبر ما إذا كانت الحاوية فارغة أم لا، إذا كانت حاوية فارغة (أي ما إذا كان حجمها 0)، تُرجع (true)،غير ذلك ترجع (false). | O(1) |
9- ()size | تُرجع عدد العناصر في حاوية (set). | O(1) |
10- ()max_size | تُرجع الحد الأقصى لعدد العناصر التي يمكن أن تحتويها حاوية (set). | O(1) |
11- (Val)find | يبحث في الحاوية عن عنصر مكافئ لـ (Val) ويعيد مؤشر يشير لموقع العنصر إذا تم العثور عليه، وإلا فإنه يعيد مؤشر يشير لموقع “()set :: end”، أي موقع الذي يتبع العنصر الأخير في (set). | (O(log(N) |
تطبيق عملي على حاوية Set:
احتاج شخص يدعى “بوب” إلى أن يعثر على إحصائيات “الدرجة الثانية” لسلسلة من الأرقام الصحيحة، ويريد أن يختار رقم من السلسلة مرة واحدة بالضبط ثم يفرزها، إحصائيات “الدرجة الثانية” هي القيمة في الموقع الثاني لسلسلة أرقام المحددة. بمعنى آخر، هو أصغر عنصر أكبر من الحد الأدنى، وهنا سوف نساعد “بوب” في حل هذه المشكلة، كما يلي:
المدخلات:
يحتوي سطر الإدخال الأول على عدد صحيح (n ≤ 100)، حيث أن (n) هو عدد الأرقام في السلسلة، ويحتوي السطر الثاني على أعداد صحيحة مفصولة بمسافات، وهي عناصر السلسلة، هذه الأرقام لا تتجاوز 100 في القيمة المطلقة.
المخرجات:
إذا كان التسلسل المحدد يحتوي على إحصائيات الدرجة الثانية، فقم بإخراج إحصائيات الطلب هذه، وإلا فقم بإخراج (NO).
الحل: (مقترح)