C++الكلاس set
- تعريف الكلاس set
- دوال الكلاس set
- أمثلة شاملة حول التعامل مع الكلاس set
تعريف الكلاس set
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و بترتيب معين حيث يتم وضع العنصر الذي يملك القيمة الأصغر في البداية و العنصر الذي يملك القيمة الأكبر في النهاية أو العكس, مع الإشارة إلى أنه لا يمكن تخزين قيم مكررة فيها كالتالي.
الآن, عليك معرفة أن العناصر الموجودة في هذه الحاوية لا يمكن تعديل قيمها لأن ترتيب أماكن عناصرها يتم على أساس قيمها.
في حال أردت تعديل قيمة عنصر, فيجب أن تحذفه من الحاوية و تقوم بإجراء تعديل عليه و من بعدها تقوم بإضافته فيها من جديد.
كما أنك تستطيع تخصيص الطريقة التي يتم فيها ترتيب العناصر حتى تتناسب مع أنواع العناصر التي ستقوم بتخزينها لأنك على الأغلب لن تتعامل مع عناصر قيمتها int فقط. كمثال بسيط قد تكون العناصر التي تريد تخزينها عبارة كائنات من كلاس إسمه Product
يمثل منتج, هنا يكون كل منتج يملك عدة معلومات مثل إسمه, رقم التعرفة الخاص به, سعره و تاريخ إنتاجه. في هذه الحالة يمكنك تخصيص الطريقة التي سيتم فيها ترتيب العناصر فمثلاً يمكنك جعل العناصر (التي تمثل منتجات) يتم ترتيبها على أساس رقم التعرفة الخاص بكل منتج.
لاستخدام الكلاس set - أي حتى تتمكن من إنشاء كائنات منه - يجب تضمين الملف #include<set> لأنه موجود فيه.
بناء الكلاس
إذاً عند إنشاء كائن من الكلاس set يجب أن نمرر له نوع البيانات الذي نريد تخزينه فيه مكان الباراميتر T
.
دوال الكلاس set
الجدول التالي يحتوي على دوال الكلاس set التي تستخدم للحصول على عداد يتيح المرور على عناصره.
الدالة مع تعريفها | |
---|---|
1 | iterator begin()
ترجع كائن iterator يشير لمكان أول عنصر في الكائن الذي قام باستدعائها.إذا كنا ننوي استخدام الدالة begin() بداخل حلقة فإننا نستخدم معها الدالة end() من أجل البدء من أول عنصر و الوقوف عند آخر عنصر. |
2 | iterator end()
ترجع كائن iterator يشير لمكان آخر عنصر في الكائن الذي قام باستدعائها.إذا كنا ننوي استخدام الدالة begin() بداخل حلقة فإننا نستخدم معها الدالة end() من أجل البدء من أول عنصر و الوقوف عند آخر عنصر. |
3 | iterator rbegin()
ترجع كائن iterator يشير لمكان آخر عنصر في الكائن الذي قام باستدعائها.إذا كنا ننوي استخدام الدالة rbegin() بداخل حلقة فإننا نستخدم معها الدالة rend() من أجل البدء من آخر عنصر و الوقوف عند أول عنصر. |
4 | iterator rend()
ترجع كائن iterator يشير لمكان أول عنصر في الكائن الذي قام باستدعائها.إذا كنا ننوي استخدام الدالة rbegin() بداخل حلقة فإننا نستخدم معها الدالة rend() من أجل البدء من آخر عنصر و الوقوف عند أول عنصر. |
الجدول التالي يحتوي على دوال الكلاس set التي تستخدم للحصول على عدد عناصره.
الدالة مع تعريفها | |
---|---|
1 | bool empty()
تستخدم لمعرفة ما إن كان الكائن الذي قام باستدعائها فارغاً أم لا. ترجع false في حال كان يوجد فيه عنصر أو أكثر, و ترجع true إن لم يكن كذلك. |
2 | size_t size() تستخدم للحصول على عدد العناصر الموجودة في الكائن الذي قام باستدعائها. |
3 | size_t max_size() تستخدم للحصول على أكبر عدد عناصر يمكن تخزينها في الكائن الذي قام باستدعائها. |
الجدول التالي يحتوي على دوال الكلاس set التي تستخدم للتحكم بعناصره.
الدالة مع تعريفها | |
---|---|
1 | iterator insert(const_iterator position, T& val)
تستخدم لإضافة عنصر جديد في مكان محدد - أي عند عنوان محدد - في الكائن الذي قام باستدعائها. مكان الباراميتر position نمرر كائن أصله من Iterator يشير لعنوان المكان الذي سيتم إضافة العنصر عنده في الذاكرة.مكان الباراميتر val نمرر القيمة التي نريد وضعها في العنصر الذي سيتم إضافته.كما أنها ترجع كائن أصله من Iterator يمثل عنوان العنصر الذي تم إضافته. |
2 | iterator erase(const_iterator position)
تستخدم لحذف عنصر محدد من الكائن الذي قام باستدعائها. مكان الباراميتر position نمرر كائن أصله من Iterator يشير لعنوان العنصر الذي سيتم حذفه. |
3 | iterator erase(const_iterator first, const_iterator last)
تستخدم لحذف مجموعة عناصر من الكائن الذي قام باستدعائها. مكان الباراميتر first نمرر كائن أصله من const_iterator يشير لعنوان العنصر الذي سيتم بدء الحذف من عنده.مكان الباراميتر last نمرر كائن أصله من const_iterator يشير لعنوان العنصر الذي سيتم إيقاف الحذف عنده. |
4 | void swap(set& anotherSet)
تستخدم لتبديل قيم عناصر الكائن الذي قام باستدعائها بقيم عناصر الكائن الذي نمرره لها. مكان الباراميتر anotherSet نمرر لها كائن من الكلاس set يملك نفس نوع عناصر الكائن الذي قام باستدعائها. |
5 | void emplace(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها. |
الجدول التالي يحتوي على دوال الكلاس set التي تستخدم للبحث فيه.
الدالة مع تعريفها | |
---|---|
1 | size_t count(T& val)
تستخدم للبحث في الكائن الذي قام باستدعائها عن عنصر يملك قيمة محددة. مكان الباراميتر val نمرر القيمة التي نريد البحث عنها.في حال تم إيجاد عنصر يملك نفس القيمة التي تم تمريرها لها ترجع القيمة 1 و في حال لم يتم إيجاد عنصر يملك نفس القيمة ترجع القيمة 0 . |
2 | iterator find(const T& val)
تستخدم للبحث في الكائن الذي قام باستدعائها عن عنصر يملك قيمة محددة. مكان الباراميتر val نمرر القيمة التي نريد البحث عنها.في حال تم إيجاد عنصر يملك نفس القيمة التي تم تمريرها لها ترجع كائن من Iterator يشير لعنوان العنصر في الذاكرة.و في حال لم يتم إيجاد عنصر يملك نفس القيمة التي تم تمريرها لها ترجع كائن من Iterator قيمته تساوي القيمة التي ترجعها الدالة end(). |
أمثلة شاملة حول التعامل مع الكلاس set
في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.
في المثال التالي قمنا بتعريف كائن من set مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int.
بعدها قمنا بإضافة بعض العناصر فيه و من ثم طباعة عدد العناصر التي قمنا بإضافتها.
بعدها قمنا بعرض جميع قيم العناصر الموجودة فيه بواسطة حلقة.
ملاحظة: قمنا باستخدام الدالة emplace() لإضافة العناصر, الدالة size() لمعرفة عدد العناصر التي تم إضافتها. عند عرض جميع قيم عناصر الكائن, قمنا باستخدام الدالة begin() للحصول على مؤشر للعنصر الأول لأننا سنبدأ من عنده و الدالة end() للحصول على مؤشر للعنصر الأخير لأننا سنتوقف عنده.
المثال الأول
سنحصل على النتيجة التالية عند التشغيل.
mySet size = 5 mySet values = 1 2 3 4 5
في المثال التالي قمنا بتعريف كائن من set مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بعرض القيم الموجودة فيه بواسطة حلقة بشكل عكسي, أي من الآخر إلى الأول.
ملاحظة: قمنا باستخدام الدالة rbegin() للحصول على مؤشر للعنصر الأخير لأننا سنبدأ من عنده و الدالة rend() للحصول على مؤشر للعنصر الأول لأننا سنتوقف عنده.
المثال الثاني
سنحصل على النتيجة التالية عند التشغيل.
mySet values = 5 4 3 2 1
في المثال التالي قمنا بتعريف كائن من set مخصص لتخزين قيم نوعها int بشكل تنازلي (أي من الأكبر إلى الأصغر) مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بعرض القيم الموجودة فيه بواسطة حلقة.
المثال الثالث
سنحصل على النتيجة التالية عند التشغيل.
mySet values = 5 4 3 2 1
في المثال التالي قمنا بتعريف كائن من set مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بالبحث عن قيمة محددة فيه لمعرفة ما إن كانت موجودة فيه أم لا.
ملاحظة: قمنا باستخدام الدالة count() للبحث عن القيمة في الكائن.
المثال الرابع
سنحصل على النتيجة التالية عند التشغيل.
4 is exist in myset
في المثال التالي قمنا بتعريف كائن من set مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بالبحث عن قيمة محددة فيه و في حال كانت موجودة سنقوم بحذف العنصر الذي يملكها من الكائن.
ملاحظة: قمنا باستخدام الدالة find() للبحث عن القيمة في الكائن و الدالة erase() لحذف العنصر من الكائن.
المثال الخامس
سنحصل على النتيجة التالية عند التشغيل.
element with value '4' is removed from mySet mySet values = 1 2 3 5
في المثال التالي قمنا بتعريف كائنين من set مع تحديد أنه يمكن أن يحتويان على عناصر نوعها int.
بعدها قمنا بتبديل عناصرهما و من ثم طباعة القيم التي أصبحت موجودة في كلٍّ منهما.
ملاحظة: قمنا باستخدام الدالة swap() لتبديل قيمهما.
المثال السادس
سنحصل على النتيجة التالية عند التشغيل.
set1 values = 5 6 7 8 set2 values = 1 2 3 4
في المثال التالي قمنا بتخصيص الطريقة التي سيقوم فيها الكائن الذي ننشئه من الكلاس set حتى يتناسب مع نوع العناصر التي سنقوم بتخزينها فيه.
في البداية قمنا بتعريف كلاس إسمه Book
يمثل الشكل العام لأي كتاب و هو يحتوي على خاصيّتين و هما إسم الكتاب title
و رقم التعرفة id
الخاص به.
بعدها قمنا بإنشاء كلاس إسمه Compare
سنستخدمه لنحدد الطريقة التي سيتم على أساسها ترتيب قيم العناصر.
في هذا الكلاس قمنا بإنشاء عامل ( Operator ) يملك باراميترين نوعهما Book
لأن فكرة هذا العامل أنه يقارن أي عنصر جديد ( عبارة عن كائن من Book
) نقوم بإضافته مع أول عنصر موجود في الكائن. لذا الباراميتر الأول يعتبر العنصر الأول الموجود في الكائن و الباراميتر الثاني يعتبر العنصر الجديد الذي سيتم إضافته.
على هذا الأساس قمنا بتحديد أنه في حال كانت قيمة id
في الباراميتر الأول أصغر من قيمة id
في الباراميتر الثاني سيتم وضع العنصر الذي تم تمريره في الباراميتر الأول في بداية الكائن.
في الأخير قمنا بإنشاء ثلاث كائنات من الكلاس Book
لأنها ستكون بمثابة العناصر التي سنقوم بتخزينها في الحاوية.
و من ثم قمنا بإنشاء كائن من set مع تحديد أنه سيتم تخزين عناصر نوعها Book
فيه و أنه سيستخدم العامل الموجود في الكلاس Compare
حتى يرتب العناصر التي نضيفها فيه و من بعدها أضفنا العناصر فيه, ثم قمنا بعرضها بواسطة حلقة.
ملاحظة: قمنا باستخدام الحلقة Foreach عند عرض قيم العناصر.
المثال السابع
سنحصل على النتيجة التالية عند التشغيل.
All books in mySet: 1 - HTML5 for dummies 2 - C++ for beginner 3 - Building Android apps