إعلان
دورة تطوير التطبيقات باستخدام لغة 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++ الكلاس priority_queue

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

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



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


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


    بناء الكلاس

    template < class T, class Alloc = allocator<T> >
    class priority_queue;
    	

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

    دوال الكلاس priority_queue

    الجدول التالي يحتوي على جميع دوال الكلاس priority_queue.

    الدالة مع تعريفها
    bool empty() تستخدم لمعرفة ما إن كان الكائن الذي قام باستدعائها فارغاً أم لا.
    ترجع false في حال كان يوجد فيه عنصر أو أكثر, و ترجع true إن لم يكن كذلك.
    size_t size() تستخدم للحصول على عدد العناصر الموجودة في الكائن الذي قام باستدعائها.
    reference& top() تستخدم لتغيير قيمة العنصر الموجود في آخر الكائن الذي قام باستدعائها أو للحصول على قيمته.
    void push(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها.
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته.
    void emplace(T& val) تستخدم لإضافة عنصر جديد في الكائن الذي قام باستدعائها تماماً كالدالة push().
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته.
    void pop() تستخدم لحذف آخر عنصر موجود في الكائن الذي قام باستدعائها.
    void swap(priority_queue& anotherPriorityQueue) تستخدم لتبديل قيم عناصر الكائن الذي قام باستدعائها بقيم عناصر الكائن الذي نمرره لها.
    مكان الباراميتر anotherPriorityQueue نمرر لها كائن من الكلاس priority_queue يملك نفس نوع عناصر الكائن الذي قام باستدعائها.

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

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


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

    ملاحظة: قمنا باستخدام الدالة push() لإضافة العناصر, الدالة size() لمعرفة عدد العناصر التي تم إضافتها, الدالة top() للحصول على قيمة العنصر الموجود في أعلى الكائن في كل مرة, الدالة pop() لحذف العنصر الموجود في أعلى الكائن و الدالة empty() لمعرفة ما إن كان الكائن يحتوي على عناصر بعد أم لا.

    المثال الأول

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنه أن يحتوي على قيم نوعها priority_queue هنا قمنا بتعريف كائن من الكلاس
        priority_queue<int> pq;
    
    	// push() باستخدام الدالة pq هنا قمنا بإضافة 5 عناصر في الكائن
    	// {5, 4, 3, 2, 1} العناصر سيتم ترتيبها بشكل تلقائي من الأكبر إلى الأصغر كالتالي
    	pq.push(3);
    	pq.push(1);
    	pq.push(2);
    	pq.push(5);
    	pq.push(4);
    	
    	// size() باستخدام الدالة pq هنا قمنا بطباعة عدد عناصر الكائن
        cout << "pq size = " << pq.size() << endl;
    	
        cout << "Popping out pq elements:";
    
    	// لا يزال يحتوي على عناصر pq هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,pq في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في آخر الكائن
        while (!pq.empty())
        {
            cout << " " << pq.top();
    		pq.pop();
        }
    
        return 0;
    }
    		

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

    pq size = 5
    Popping out pq elements: 5 4 3 2 1
    		


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

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

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// string يمكنه أن يحتوي على قيم نوعها priority_queue هنا قمنا بتعريف كائن من الكلاس
        priority_queue<string> pq;
    
    	// push() باستخدام الدالة pq هنا قمنا بإضافة 5 عناصر في الكائن
    	// {Strawberry, Blueberry, Banana, Apple} العناصر سيتم ترتيبها بشكل تلقائي من الأكبر إلى الأصغر كالتالي
    	pq.push("Apple");
    	pq.push("Banana");
    	pq.push("Blueberry");
    	pq.push("Strawberry");
    	
        cout << "Popping out pq elements:";
    
    	// لا يزال يحتوي على عناصر pq هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,pq في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في آخر الكائن
        while (!pq.empty())
        {
            cout << " " << pq.top();
    		pq.pop();
        }
    
        return 0;
    }
    		

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

    Popping out pq elements: Strawberry Blueberry Banana Apple
    		


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

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

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

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    int main()
    {
    	// int يمكنهما أن يحتويان على قيم نوعها priority_queue هنا قمنا بتعريف كائنين من الكلاس
        priority_queue<int> pq1;
        priority_queue<int> pq2;
    
    	// push() باستخدام الدالة pq1 هنا قمنا بإضافة 4 عناصر في الكائن
    	// {4, 3, 2, 1} العناصر سيتم ترتيبها بشكل تلقائي من الأكبر إلى الأصغر كالتالي
    	pq1.push(3);
    	pq1.push(1);
    	pq1.push(4);
    	pq1.push(2);
    	
    	// push() باستخدام الدالة pq2 هنا قمنا بإضافة 4 عناصر في الكائن
    	// {8, 7, 6, 5} العناصر سيتم ترتيبها بشكل تلقائي من الأكبر إلى الأصغر كالتالي
    	pq2.push(5);
    	pq2.push(6);
    	pq2.push(8);
    	pq2.push(7);
    	
    	// pq2 مع قيم الكائن pq1 هنا قمنا بتبديل قيم الكائن
    	pq1.swap(pq2);
    	
        cout << "Popping out pq1 elements:";
    
    	// لا يزال يحتوي على عناصر pq1 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,pq1 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في آخر الكائن
        while (!pq1.empty())
        {
            cout << " " << pq1.top();
    		pq1.pop();
        }
    	
        cout << "\nPopping out pq2 elements:";
    
    	// لا يزال يحتوي على عناصر pq2 هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,pq2 في كل دورة من دورات الحلقة سيتم طباعة قيمة العنصر الموجود في آخر الكائن
        while (!pq2.empty())
        {
            cout << " " << pq2.top();
    		pq2.pop();
        }
    
        return 0;
    }
    		

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

    Popping out pq1 elements: 8 7 6 5
    Popping out pq2 elements: 4 3 2 1
    		


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

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

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

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

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

    main.cpp
    #include <iostream>
    #include <queue>
    
    using namespace std;
    
    // Book هنا قمنا بتعريف الكلاس
    class Book
    {
        public:
    		// هنا قمنا بتعريف خصائص الكلاس
            string title;
            double price;
    		
    		// هنا قمنا بتعريف كونستكتور للكلاس حتى نستطيع تمرير قيم للخصائص بشكل مباشر عند إنشاء كائن منه
            Book(string title, double price)
            {
                this->title = title;
                this->price = price;
            }
    };
    
    // priority_queue و الذي سنستخدمه لاحقاً لتحديد كيف ستترتب العناصر في الحاوية التي ننشئها من الكلاس Compare هنا قمنا بتعريف الكلاس
    class Compare
    {
        public:
    		// price حتى يقارن قيمة priority_queue هنا قمنا بتعريف العامل الذي سيستخدمه الكائن الذي ننشئه من الكلاس
    		// الموجودة في أول عنصر فيها price في الكائن الذي سيتم إضافته في الحاوية مع قيمة
            bool operator() (Book b1, Book b2)
            {
    			// الموجودة في العنصر الجديد أكبر من price هنا كأننا نعلم المترجم بأنه في حال كانت قيمة
    			// الموجودة في العنصر الأول في الحاوية, فإننا نريد وضعها هي في البداية price قيمة
                return (b1.price > b2.price);
            }
    };
    
    // main() هنا قمنا بتعريف الدالة
    int main()
    {
    	// بالإضافة إلى Book يمكنه أن يحتوي على كائنات من الكلاس priority_queue هنا قمنا بتعريف كائن من الكلاس
    	// من أجل تحديد الطريقة التي سيتم فيها ترتيب الكائنات التي نضيفها فيه Compare أنه يعتمد على الكلاس 
        priority_queue<Book, vector<Book>, Compare> pq;
    
    	// pq لأننا سنضعها كعناصر في الحاوية Book هنا قمنا بإنشاء 3 كائنات من الكلاس
        Book book1("C++ for beginner", 18);
        Book book2("HTML5 for dummies", 12);
        Book book3("Building Android apps", 25);
    
    	// push() باستخدام الدالة pq في الكائن book3, book2 و book1 هنا قمنا بإضافة الكائنات
    	// {book3, book1, book2} فيها كالتالي price العناصر سيتم ترتيبها من الأكبر إلى الأصغر على حسب قيمة الخاصية
        pq.push(book1);
        pq.push(book2);
        pq.push(book3);
    
        cout << "Popping out stored Books:\n";
    
    	// لا يزال يحتوي على عناصر pq هنا قمنا بإنشاء حلقة تستمر في تنفيذ الأوامر الموجودة فيها طالما أن الكائن
    	// بعدها سيتم حذفه مباشرةً ,pq في كل دورة من دورات الحلقة سيتم طباعة قيم العنصر الموجود في آخر الكائن
        while (!pq.empty())
        {
            cout << "- " << pq.top().title << " [" << pq.top().price << "$]\n";
            pq.pop();
        }
    
        return 0;
    }
    		

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

    Popping out stored Books:
    - HTML5 for dummies [12$]
    - C++ for beginner [18$]
    - Building Android apps [25$]
    		
    إعلان

    Eqla3Tech.com

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

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

    الدورات

    أدوات مساعدة

    الأقسام

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