إعلان
دورة تطوير التطبيقات باستخدام لغة JavaScript في هذه الدورة ستتعلم لغة جافا سكريبت, استخدام مكتبة React.js, بناء API الموقع بواسطة Node.js, تطوير تطبيق جوال باستخدام React Native, و في نهاية الدورة ستتعلم تطوير تطبيق محادثة شبيه بتطبيق WhatsApp. تعلم الآن
دورة تطوير واجهات المستخدم في هذه الدورة ستتعلم لغة HTML و لغة CSS و لغة JavaScript. من ناحية التطبيق العملي ستتعلم طريقة بناء واجهة متجر إلكتروني مكون من ست صفحات, تحويل خمسة تصاميم PSD إلى صفحات ويب, بناء واجهة مستخدم تشبه موقع يوتيوب, بناء لوحة تحكم إحترافية. تعلم الآن
تطوير تطبيقات باستخدام لغة بايثون في هذه الدورة ستتعلم أساسيات البرمجة بلغة بايثون وصولاً إلى التعامل مع أشهر أطر العمل (Flask و Django) و ستتعلم كيف تبني متجر إلكتروني يمكن للمستخدمين البيع و الشراء من خلاله. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة PHP في هذه الدورة ستتعلم لغة PHP من الصفر, استخدام إطار العمل Laravel بشرح مفصّل و عملي, كيفية تطوير شبكة اجتماعية تشبه Instagram, بناء API لتطبيق جوال وفق أسلوب RESTful, تطوير موقع إعلانات مبوبة, تطوير نظام إدارة محتوى CMS كامل. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة Ruby في هذه الدورة ستتعلم البرمجة بلغة Ruby إنطلاقاً من أبسط المفاهيم وحتى بناء تطبيق حقيقي, إستخدام إطار العمل Ruby on Rails بشرح مفصّل و عملي, بناء تطبيق حقيقي عبارة عن شبكة اجتماعية تشبه تويتر, تطوير مجتمع الكتروني يشبه حسوب I/O. تعلم الآن
دورة علوم الحاسوب هذه الدورة معدة لتكون مدخل لعلوم الحاسوب و لغات البرمجة حيث ستتعرف فيها على أنظمة التشغيل و ستتعمق في نظام لينكس و في كيفية التعامل معه من خلال موجه الأوامر, بالإضافة إلى قواعد البيانات و أساسيات الشبكات و الخوادم و مبادئ الحماية والأمان في الويب. تعلم الآن

    C++ الكلاس multiset

    تعريف الكلاس multiset

    يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و بترتيب معين حيث يتم وضع العنصر الذي يملك القيمة الأصغر في البداية و العنصر الذي يملك القيمة الأكبر في النهاية أو العكس, مع الإشارة إلى أنه يمكن تخزين قيم مكررة فيها كالتالي.



    الآن, عليك معرفة أن العناصر الموجودة في هذه الحاوية لا يمكن تعديل قيمها لأن ترتيب أماكن عناصرها يتم على أساس قيمها.
    في حال أردت تعديل قيمة عنصر, فيجب أن تحذفه من الحاوية و تقوم بإجراء تعديل عليه و من بعدها تقوم بإضافته فيها من جديد.

    كما أنك تستطيع تخصيص الطريقة التي يتم فيها ترتيب العناصر حتى تتناسب مع أنواع العناصر التي ستقوم بتخزينها لأنك على الأغلب لن تتعامل مع عناصر قيمتها int فقط. كمثال بسيط قد تكون العناصر التي تريد تخزينها عبارة كائنات من كلاس إسمه Product يمثل منتج, هنا يكون كل منتج يملك عدة معلومات مثل إسمه, رقم التعرفة الخاص به, سعره و تاريخ إنتاجه. في هذه الحالة يمكنك تخصيص الطريقة التي سيتم فيها ترتيب العناصر فمثلاً يمكنك جعل العناصر (التي تمثل منتجات) يتم ترتيبها على أساس رقم التعرفة الخاص بكل منتج.


    لاستخدام الكلاس multiset - أي حتى تتمكن من إنشاء كائنات منه - يجب تضمين الملف #include<set> لأنه موجود فيه.


    بناء الكلاس

    template < class T,                        // multiset::key_type/value_type
               class Compare = less<T>,        // multiset::key_compare/value_compare
               class Alloc = allocator<T>      // multiset::allocator_type
               > class multiset;
    	

    إذاً عند إنشاء كائن من الكلاس multiset يجب أن نمرر له نوع البيانات الذي نريد تخزينه فيه مكان الباراميتر T.

    دوال الكلاس multiset

    الجدول التالي يحتوي على دوال الكلاس multiset التي تستخدم للحصول على عداد يتيح المرور على عناصره.

    الدالة مع تعريفها
    iterator begin() ترجع كائن iterator يشير لمكان أول عنصر في الكائن الذي قام باستدعائها.
    إذا كنا ننوي استخدام الدالة begin() بداخل حلقة فإننا نستخدم معها الدالة end() من أجل البدء من أول عنصر و الوقوف عند آخر عنصر.
    iterator end() ترجع كائن iterator يشير لمكان آخر عنصر في الكائن الذي قام باستدعائها.
    إذا كنا ننوي استخدام الدالة begin() بداخل حلقة فإننا نستخدم معها الدالة end() من أجل البدء من أول عنصر و الوقوف عند آخر عنصر.
    iterator rbegin() ترجع كائن iterator يشير لمكان آخر عنصر في الكائن الذي قام باستدعائها.
    إذا كنا ننوي استخدام الدالة rbegin() بداخل حلقة فإننا نستخدم معها الدالة rend() من أجل البدء من آخر عنصر و الوقوف عند أول عنصر.
    iterator rend() ترجع كائن iterator يشير لمكان أول عنصر في الكائن الذي قام باستدعائها.
    إذا كنا ننوي استخدام الدالة rbegin() بداخل حلقة فإننا نستخدم معها الدالة rend() من أجل البدء من آخر عنصر و الوقوف عند أول عنصر.

    الجدول التالي يحتوي على دوال الكلاس multiset التي تستخدم للحصول على عدد عناصره.

    الدالة مع تعريفها
    bool empty() تستخدم لمعرفة ما إن كان الكائن الذي قام باستدعائها فارغاً أم لا.
    ترجع false في حال كان يوجد فيه عنصر أو أكثر, و ترجع true إن لم يكن كذلك.
    size_t size() تستخدم للحصول على عدد العناصر الموجودة في الكائن الذي قام باستدعائها.
    size_t max_size() تستخدم للحصول على أكبر عدد عناصر يمكن تخزينها في الكائن الذي قام باستدعائها.

    الجدول التالي يحتوي على دوال الكلاس multiset التي تستخدم للتحكم بعناصره.

    الدالة مع تعريفها
    iterator insert(const_iterator position, T& val) تستخدم لإضافة عنصر جديد في مكان محدد - أي عند عنوان محدد - في الكائن الذي قام باستدعائها.
    مكان الباراميتر position نمرر كائن أصله من Iterator يشير لعنوان المكان الذي سيتم إضافة العنصر عنده في الذاكرة.
    مكان الباراميتر val نمرر القيمة التي نريد وضعها في العنصر الذي سيتم إضافته.
    كما أنها ترجع كائن أصله من Iterator يمثل عنوان العنصر الذي تم إضافته.
    iterator erase(const_iterator position) تستخدم لحذف عنصر محدد من الكائن الذي قام باستدعائها.
    مكان الباراميتر position نمرر كائن أصله من Iterator يشير لعنوان العنصر الذي سيتم حذفه.
    iterator erase(const_iterator first, const_iterator last) تستخدم لحذف مجموعة عناصر من الكائن الذي قام باستدعائها.
    مكان الباراميتر first نمرر كائن أصله من const_iterator يشير لعنوان العنصر الذي سيتم بدء الحذف من عنده.
    مكان الباراميتر last نمرر كائن أصله من const_iterator يشير لعنوان العنصر الذي سيتم إيقاف الحذف عنده.
    void swap(multiset& anotherSet) تستخدم لتبديل قيم عناصر الكائن الذي قام باستدعائها بقيم عناصر الكائن الذي نمرره لها.
    مكان الباراميتر anotherSet نمرر لها كائن من الكلاس multiset يملك نفس نوع عناصر الكائن الذي قام باستدعائها.
    void emplace(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها.

    الجدول التالي يحتوي على دوال الكلاس multiset التي تستخدم للبحث فيه.

    الدالة مع تعريفها
    size_t count(T& val) تستخدم للبحث في الكائن الذي قام باستدعائها عن عدد العناصر التي تملك قيمة محددة.
    مكان الباراميتر val نمرر القيمة التي نريد البحث عنها.
    iterator find(const T& val) تستخدم للبحث في الكائن الذي قام باستدعائها عن أول عنصر يملك قيمة محددة.
    مكان الباراميتر val نمرر القيمة التي نريد البحث عنها.
    في حال تم إيجاد عنصر يملك نفس القيمة التي تم تمريرها لها ترجع كائن من Iterator يشير لعنوان العنصر في الذاكرة.
    و في حال لم يتم إيجاد عنصر يملك نفس القيمة التي تم تمريرها لها ترجع كائن من Iterator قيمته تساوي القيمة التي ترجعها الدالة end().

    أمثلة شاملة حول التعامل مع الكلاس multiset

    في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.


    في المثال التالي قمنا بتعريف كائن من multiset مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int.
    بعدها قمنا بإضافة بعض العناصر فيه و من ثم طباعة عدد العناصر التي قمنا بإضافتها.
    بعدها قمنا بعرض جميع قيم العناصر الموجودة فيه بواسطة حلقة.

    ملاحظة: قمنا باستخدام الدالة emplace() لإضافة العناصر, الدالة size() لمعرفة عدد العناصر التي تم إضافتها. عند عرض جميع قيم عناصر الكائن, قمنا باستخدام الدالة begin() للحصول على مؤشر للعنصر الأول لأننا سنبدأ من عنده و الدالة end() للحصول على مؤشر للعنصر الأخير لأننا سنتوقف عنده.

    المثال الأول

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنه أن يحتوي على قيم نوعها multiset هنا قمنا بتعريف كائن من الكلاس
        multiset<int> myMultiset;
    
    	// مع الإشارة إلى أننا تعمدنا إدخال نفس القيمة أكثر من مرة emplace() باستخدام الدالة myMultiset هنا قمنا بإضافة 7 عناصر في الكائن
    	// العناصر التي أضفناها سيتم ترتيبها بشكل تلقائي من الأصغر إلى الأكبر كالتالي {5, 5, 4, 3, 2, 1, 1} و ستلاحظ ذلك لاحقاً عند عرض قيمهم
        myMultiset.emplace(3);
        myMultiset.emplace(1);
        myMultiset.emplace(5);
        myMultiset.emplace(2);
        myMultiset.emplace(5);
        myMultiset.emplace(4);
        myMultiset.emplace(1);
    	
    	// size() باستخدام الدالة myMultiset هنا قمنا بطباعة عدد عناصر الكائن
        cout << "myMultiset size = " << myMultiset.size() << endl;
    	
        cout << "myMultiset values =";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myMultiset هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = myMultiset.begin(); it != myMultiset.end(); ++it)
        {
            cout << " " << *it;
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    myMultiset size = 7
    myMultiset values = 1 1 2 3 4 5 5
    		


    في المثال التالي قمنا بتعريف كائن من multiset مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
    بعدها قمنا بعرض القيم الموجودة فيه بواسطة حلقة بشكل عكسي, أي من الآخر إلى الأول.

    ملاحظة: قمنا باستخدام الدالة rbegin() للحصول على مؤشر للعنصر الأخير لأننا سنبدأ من عنده و الدالة rend() للحصول على مؤشر للعنصر الأول لأننا سنتوقف عنده.

    المثال الثاني

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها multiset هنا قمنا بتعريف كائن من الكلاس
    	// العناصر التي أضفناها سيتم ترتيبها بشكل تلقائي من الأصغر إلى الأكبر كالتالي {5, 4, 3, 2, 1} و ستلاحظ ذلك لاحقاً عند عرض قيمهم
        multiset<int> myMultiset = {1, 4, 2, 5, 3};
    	
        cout << "myMultiset values =";
    
    	// إبتداءاً من آخر عنصر وصولاً لأول عنصر فيه myMultiset هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = myMultiset.rbegin(); it != myMultiset.rend(); ++it)
        {
            cout << " " << *it;
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    myMultiset values = 5 4 3 2 1
    		


    في المثال التالي قمنا بتعريف كائن من multiset مخصص لتخزين قيم نوعها int بشكل تنازلي (أي من الأكبر إلى الأصغر) مع إضافة عدة قيم فيه عند تعريفه.
    بعدها قمنا بعرض القيم الموجودة فيه بواسطة حلقة.

    المثال الثالث

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها multiset هنا قمنا بتعريف كائن من الكلاس
    	// من أجل ترتيب القيم greater قيم هذا الكائن سيتم ترتيبها من الأكبر إلى الأصغر و سبب ذلك أننا جعلناه يعتمد على الكلاس
    	// العناصر التي أضفناها سيتم ترتيبها بشكل تلقائي كالتالي {5, 4, 3, 2, 1} و ستلاحظ ذلك لاحقاً عند عرض قيمهم
        multiset<int, greater<int>> myMultiset = {1, 4, 2, 5, 3};
    
        cout << "myMultiset values =";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myMultiset هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = myMultiset.begin(); it != myMultiset.end(); ++it)
        {
            cout << " " << *it;
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    myMultiset values = 5 4 3 2 1
    		


    في المثال التالي قمنا بتعريف كائن من multiset مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
    بعدها قمنا بالبحث عن قيم محددة فيه لمعرفة كم عنصر يملك هذه القيم.

    ملاحظة: قمنا باستخدام الدالة count() لمعرفة كم مرة القيم مكررة في الكائن.

    المثال الرابع

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها multiset هنا قمنا بتعريف كائن من الكلاس
        multiset<int> myMultiset = {1, 4, 2, 3, 4, 5, 2, 4, 7};
    	
    	// التي تملك القيمة 4 myMultiset هنا قمنا بطباعة عدد العناصر الموجودة في الكائن
    	cout << "4 is exist " << myMultiset.count(4)  << " time(s)\n";
    	
    	// التي تملك القيمة 9 myMultiset هنا قمنا بطباعة عدد العناصر الموجودة في الكائن
    	cout << "9 is exist " << myMultiset.count(9)  << " time(s)";
        
    	return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    4 is exist 3 time(s)
    9 is exist 0 time(s)
    		


    في المثال التالي قمنا بتعريف كائن من multiset مخصص لتخزين قيم نوعها int مع إضافة عدة قيم فيه عند تعريفه.
    بعدها قمنا بالبحث عن قيمة محددة فيه و في حال كانت موجودة سنقوم بحذف العنصر الذي يملكها من الكائن.

    ملاحظة: قمنا باستخدام الدالة find() للبحث عن القيمة في الكائن و الدالة erase() لحذف العنصر من الكائن.

    المثال الخامس

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها multiset هنا قمنا بتعريف كائن من الكلاس
        multiset<int> myMultiset = {1, 2, 3, 4, 5};
    
    	// لتخزين مكان العنصر الذي نجد القيمة التي نبحث عنها فيه multiset<int>::iterator منا قمنا بتعريف كائن من 
        multiset<int>::iterator it;
    
    	// it عن عنصر يملك القيمة 4, و بالتالي في حال وجود عنصر يملك القيمة 4 سيتم تخزين عنوانه في الكائن myMultiset هنا قمنا بالبحث في الكائن
    	// فيه للإشارة إلى أنه لم يتم إيجاد أي عنصر يملك هذه القيمة myMultiset.end() في حال عدم وجود عنصر يملك القيمة 4 سيتم تخزين القيمة التي ترجعها
        it = myMultiset.find(4);
    
    	// فهذا يعني أنه تم إيجاد القيمة و بالتالي سيتم تنفيذ الكود الموضوع فيها myMultiset.end() لا تساوي القيمة التي ترجعها الدالة it في حال كانت قيمة
        if (it != myMultiset.end())
        {
    		// و من ثم قمنا بحذفه myMultiset هنا قمنا بطباعة قيمة العنصر الذي تم إيجاده في الكائن
            cout << "element with value '"<< *it << "' is removed from myMultiset\n";
            myMultiset.erase(it);
        }
    
        cout << "myMultiset values =";
    
        // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myMultiset هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = myMultiset.begin(); it != myMultiset.end(); ++it)
        {
            cout << " " << *it;
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    element with value '4' is removed from myMultiset
    myMultiset values = 1 2 3 5
    		


    في المثال التالي قمنا بتعريف كائنين من multiset مع تحديد أنه يمكن أن يحتويان على عناصر نوعها int.
    بعدها قمنا بتبديل عناصرهما و من ثم طباعة القيم التي أصبحت موجودة في كلٍّ منهما.

    ملاحظة: قمنا باستخدام الدالة swap() لتبديل قيمهما.

    المثال السادس

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    int main()
    {
    	// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيهما int يمكنهما أن يحتويان على قيم نوعها multiset هنا قمنا بتعريف كائنين من الكلاس
        multiset<int> multiset1 = {1, 2, 3, 4};
        multiset<int> multiset2 = {5, 6, 7, 8};
    
    	// multiset2 مع قيم الكائن multiset1 هنا قمنا بتبديل قيم الكائن
    	multiset1.swap(multiset2);
    	
        cout << "multiset1 values = ";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه multiset1 هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = multiset1.begin(); it != multiset1.end(); ++it)
        {
            cout << *it << " ";
        }
    	
        cout << "\nmultiset2 values = ";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه multiset2 هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = multiset2.begin(); it != multiset2.end(); ++it)
        {
            cout << *it << " ";
        }
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    multiset1 values = 5 6 7 8
    multiset2 values = 1 2 3 4
    		


    في المثال التالي قمنا بتخصيص الطريقة التي سيقوم فيها الكائن الذي ننشئه من الكلاس multiset حتى يتناسب مع نوع العناصر التي سنقوم بتخزينها فيه.

    في البداية قمنا بتعريف كلاس إسمه Book يمثل الشكل العام لأي كتاب و هو يحتوي على خاصيّتين و هما إسم الكتاب title و رقم التعرفة id الخاص به.

    بعدها قمنا بإنشاء كلاس إسمه Compare سنستخدمه لنحدد الطريقة التي سيتم على أساسها ترتيب قيم العناصر.
    في هذا الكلاس قمنا بإنشاء عامل ( Operator ) يملك باراميترين نوعهما Book لأن فكرة هذا العامل أنه يقارن أي عنصر جديد ( عبارة عن كائن من Book ) نقوم بإضافته مع أول عنصر موجود في الكائن. لذا الباراميتر الأول يعتبر العنصر الأول الموجود في الكائن و الباراميتر الثاني يعتبر العنصر الجديد الذي سيتم إضافته.
    على هذا الأساس قمنا بتحديد أنه في حال كانت قيمة id في الباراميتر الأول أصغر من قيمة id في الباراميتر الثاني سيتم وضع العنصر الذي تم تمريره في الباراميتر الأول في بداية الكائن.

    في الأخير قمنا بإنشاء ثلاث كائنات من الكلاس Book لأنها ستكون بمثابة العناصر التي سنقوم بتخزينها في الحاوية.
    و من ثم قمنا بإنشاء كائن من multiset مع تحديد أنه سيتم تخزين عناصر نوعها Book فيه و أنه سيستخدم العامل الموجود في الكلاس Compare حتى يرتب العناصر التي نضيفها فيه و من بعدها أضفنا العناصر فيه, ثم قمنا بعرضها بواسطة حلقة.

    ملاحظة: قمنا باستخدام الحلقة Foreach عند عرض قيم العناصر.

    المثال السابع

    main.cpp
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    // Book هنا قمنا بتعريف الكلاس
    class Book
    {
        public:
    		// هنا قمنا بتعريف خصائص الكلاس
            int id;
            string title;
    		
    		// هنا قمنا بتعريف كونستكتور للكلاس حتى نستطيع تمرير قيم للخصائص بشكل مباشر عند إنشاء كائن منه
            Book(int id, string title)
            {
                this->id = id;
                this->title = title;
            }
    };
    
    // multiset و الذي سنستخدمه لاحقاً لتحديد كيف ستترتب العناصر في الحاوية التي ننشئها من الكلاس Compare هنا قمنا بتعريف الكلاس
    class Compare
    {
        public:
    		// id حتى يقارن قيمة multiset هنا قمنا بتعريف العامل الذي سيستخدمه الكائن الذي ننشئه من الكلاس
    		// الموجودة في أول عنصر فيها id في الكائن الذي سيتم إضافته في الحاوية مع قيمة
            bool operator() (Book b1, Book b2)
            {
    			// الموجودة في العنصر الجديد أصغر من id هنا كأننا نعلم المترجم بأنه في حال كانت قيمة
    			// الموجودة في العنصر الأول في الحاوية, فإننا نريد وضعها هي في البداية id قيمة
                return (b1.id < b2.id);
            }
    };
    
    // main() هنا قمنا بتعريف الدالة
    int main()
    {
    	// بالإضافة إلى Book يمكنه أن يحتوي على كائنات من الكلاس multiset هنا قمنا بتعريف كائن من الكلاس
    	// من أجل تحديد الطريقة التي سيتم فيها ترتيب الكائنات التي نضيفها فيه Compare أنه يعتمد على الكلاس 
        multiset<Book, Compare> myMultiset;
    
    	// myMultiset لأننا سنضعها كعناصر في الحاوية Book هنا قمنا بإنشاء 3 كائنات من الكلاس
        Book book1(2, "C++ for beginner");
        Book book2(1, "HTML5 for dummies");
        Book book3(3, "Building Android apps");
    
    	// emplace() باستخدام الدالة myMultiset في الكائن book3, book2 و book1 هنا قمنا بإضافة الكائنات
    	// {book2, book1, book3} فيها كالتالي id العناصر سيتم ترتيبها من الأسغر إلى الأكبر على حسب قيمة الخاصية
        myMultiset.emplace(book1);
        myMultiset.emplace(book2);
        myMultiset.emplace(book3);
    
        cout << "All books in myMultiset:\n";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myMultiset هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيم عنصر جديد من العناصر الموجودة في الكائن
        for (auto const &e: myMultiset)
        {
            cout << e.id << " - " << e.title << endl;
    	}
    
        return 0;
    }
    		

    سنحصل على النتيجة التالية عند التشغيل.

    All books in myMultiset:
    1 - HTML5 for dummies
    2 - C++ for beginner
    3 - Building Android apps
    		
    إعلان

    Eqla3Tech.com

    شروحات مكتوبة حول لغات البرمجة و تقنية المعلومات باللغة العربية مقدمة من إقلاع تك.

    لغة جافا لغة ++C قواعد البيانات نظام ويندوز نظام لينكس الشبكات تقنية المعلومات الأمن السيبراني

    الدورات

    أدوات مساعدة

    الأقسام

    دورات
    مقالات أسئلة مشاريع كتب