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

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

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

    • الكائن يملك خانة أساسية يقال لها Head و هي تشير لعنوان أول عنصر موجود فيه.
    • العنصر الأول لا يوجد أي عنصر قبله, لهذا يكون عنوان العنصر السابق بالنسبة له يساوي null للإشارة إلى أنه لا يوجد عنصر قبله.
    • العنصر الأخير لا يوجد أي عنصر بعده, لهذا يكون عنوان العنصر التالي بالنسبة له يساوي null للإشارة إلى أنه لا يوجد عنصر بعده.


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


    بناء الكلاس

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

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

    دوال الكلاس list

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

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

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

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

    معلومة: هذه الدالة قد تكون مفيدة في حال أردت حجز مساحة أوليّة للعناصر قبل البدء بإضافتهم بدل جعل المترجم يفعل ذلك كلما أضفت عنصر جديد.
    هذه المعلومة غير مذكورة في المرجع الرسمي للغة C++ لذا قد تكون غير دقيقة.

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

    الدالة مع تعريفها
    reference front() تستخدم للوصول لقيمة أول عنصر موجود في الكائن الذي قام باستدعائها سواء لتغييرها أو للحصول عليها.
    قد تسبب مشكلة في حال كان الكائن لا يملك أي عنصر, لذلك يفضل التأكد من أن الكائن غير فارغ باستخدام الدالة empty() قبل استخدامها.
    reference back() تستخدم للوصول لقيمة آخر عنصر موجود في الكائن الذي قام باستدعائها سواء لتغييرها أو للحصول عليها.
    قد تسبب مشكلة في حال كان الكائن لا يملك أي عنصر, لذلك يفضل التأكد من أن الكائن غير فارغ باستخدام الدالة empty() قبل استخدامها.

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

    الدالة مع تعريفها
    void assign(initializer_list<T> aList) تستخدم لوضع مصفوفة من العناصر بدل العناصر الموجودة في الكائن الذي قام باستدعائها.
    بشكل عام, يمكنك الإستفادة منها في حال أردت تخزين مجموعة من العناصر في الكائن بعد إنشائه.
    مكان الباراميتر aList نمرر مصفوفة من العناصر التي تحتوي على قيم من نفس نوع الكائن الذي قام باستدعائها.
    void emplace_front(T& val) تستخدم لإضافة عنصر في بداية الكائن الذي قام باستدعائها.
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته في أول الكائن الذي قام باستدعائها.
    void push_front(T& val) تستخدم لإضافة عنصر في بداية الكائن الذي قام باستدعائها تماماً كالدالة emplace_front().
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته في أول الكائن الذي قام باستدعائها.
    void pop_front() تستخدم لحذف أول عنصر موجود في الكائن الذي قام باستدعائها.
    void emplace_back(T& val) تستخدم لإضافة عنصر في آخر الكائن الذي قام باستدعائها.
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته في آخر الكائن الذي قام باستدعائها.
    void push_back(T& val) تستخدم لإضافة عنصر في آخر الكائن الذي قام باستدعائها تماماً كالدالة emplace_back().
    مكان الباراميتر val نمرر العنصر الذي نريد إضافته في أول الكائن الذي قام باستدعائها.
    void pop_back() تستخدم لحذف آخر عنصر موجود في الكائن الذي قام باستدعائها.
    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(list& anotherList) تستخدم لتبديل قيم عناصر الكائن الذي قام باستدعائها بقيم عناصر الكائن الذي نمرره لها.
    مكان الباراميتر anotherList نمرر لها كائن من الكلاس list يملك نفس نوع عناصر الكائن الذي قام باستدعائها.
    iterator splice(const_iterator position,& anotherList) تستخدم لإضافة عناصر كائن من list في مكان محدد في الكائن الذي قام باستدعائها.
    مكان الباراميتر position نمرر كائن أصله من Iterator يمثل عنوان العنصر الذي سيتم إضافة عناصر الكائن anotherList إبتداءاً من عنده.
    مكان الباراميتر anotherList نمرر الكائن الذي نريد نسخ عناصره و الذي يجب أن تكون عناصره من نفس نوع عناصر الكائن الذي قام باستدعائها.
    void remove(const T& val) تستخدم لحذف جميع العناصر الموجودة في الكائن الذي قام باستدعائها في حال كانت قيمتها تساوي القيمة التي نمررها لها مكان الباراميتر val.
    void remove_if(Predicate pred) تستخدم هذه الدالة لحذف عناصر من الكائن الذي قام باستدعائها في حال كانت قيمه تطابق الشرط الذي نقوم بتمريره لها مكان الباراميتر pred.
    الباراميتر pred الذي يجب أن نمرره لها سيكون عبارة عن دالة ترجع true في حال كان يجب حذف العنصر و false في حال لم يكن يجب ذلك.
    void unique() تستخدم لحذف القيم المكررة من الكائن الذي قام باستدعائها.
    بمعنى آخر, تقوم بحذف أي قيمة تجدها متكررة فيه و تترك نسخة واحدة منها.
    معلومة: عند استخدام هذه الدالة يجب أن تكون القيم المكررة مرتبة وراء بعضها البعض و لفعل هذا الأمر قم فقط باستدعاء الدالة sort() من الكائن قبل استدعاء هذه الدالة.
    void merge(list& anotherList) تستخدم لنقل عناصر كائن من list في آخر الكائن الذي قام باستدعائها.
    عند نقل عناصر الكائن anotherList إلى الكائن الذي قام باستدعائها يصبح فارغاً.
    void sort() تستخدم لترتيب عناصر الكائن الذي قام باستدعائها من الأصغر إلى الأكبر.
    void reverse() تستخدم لترتيب عناصر الكائن الذي قام باستدعائها بشكل عكسي.

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

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


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

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

    المثال الأول

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

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

    values = 1 2 3 4 5 6 7
    		


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

    ملاحظة: قمنا باستخدام الدالة sort() لترتيب عناصر الكائن من الأصغر إلى الأكبر و الدالة reverse() لعكس ترتيب العناصر.

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

    main.cpp
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    // فتقوم بطباعة القيم الموجودة فيه عند استدعائها نمرر لها كائن من printهنا قمنا بتعريف دالة إسمها
    void printList(list<int> &aList)
    {
        // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = aList.begin(); it != aList.end(); ++it)
        {
            cout << *it << " ";
        }
    }
    
    // main() هنا قمنا بتعريف الدالة
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة 5 قيم فيه int يمكنه أن يحتوي على عناصر نوعها هنا قمنا بتعريف كائن من الكلاس
       <int> my= {3, 5, 1, 4, 2};
    
    	// كما أضفناها فيه myلعرض قيم عناصر الكائن printList() هنا قمنا باستدعاء الدالة
        cout << "values\n";
        printList(myList);
    
    	// من الأصغر إلى الأكبر myلترتيب قيم عناصر الكائن sort() هنا قمنا باستدعاء الدالة
        myList.sort();
    
    	// بعد أن قمنا بترتيبها myلعرض قيم عناصر الكائن printList() هنا قمنا باستدعاء الدالة
        cout << "\n\nAfter sorting values\n";
        printList(myList);
    
    	// myلعكس ترتيب قيم عناصر الكائن sort() هنا قمنا باستدعاء الدالة
        myList.reverse();
    
    	// بعد أن قمنا بترتيبها myلعرض قيم عناصر الكائن printList() هنا قمنا باستدعاء الدالة
        cout << "\n\nAfter reverse values\n";
        printList(myList);
    
        return 0;
    }
    		

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

    values
    3 5 1 4 2
    
    After sorting values
    1 2 3 4 5
    
    After reverse values
    5 4 3 2 1
    		


    في المثال التالي قمنا بتعريف كائنين من list في كل منهما 4 عناصر من النوع نوعها int.
    بعدها قمنا بدمج الكائنين في كائن واحد حيث قمنا بنقل العناصر الموجودة في الكائن الثاني إلى الكائن الأول.
    في النهاية قمنا بطباعة القيم التي أصبحت موجودة في الكائن الأول, و ما إن كان الكائن الثاني قد أصبح فارغاً أم لا.

    ملاحظة: قمنا باستخدام الدالة merge() لنقل العناصر من كائن لآخر و الدالة empty() لمعرفة ما إن كان الكائن قد أصبح فارغاً أم لا.

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

    main.cpp
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    int main()
    {
    	// int يحتوي كل منهما على 4 عناصر نوعها هنا قمنا بتعريف كائنين من الكلاس
       <int>1 = {1, 2, 3, 4};
       <int>2 = {5, 6, 7, 8};
    	
    	//1 في آخر الكائن2 هنا قمنا بنقل عناصر الكائن
    	// {1, 2, 3, 4, 5, 6, 7, 8} أصبح فيه القيم التالية1 إذاً الكائن
    	list1.merge(list2);
    	
        cout << "First values = ";
    
        // إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه1 هنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it =1.begin(); it !=1.end(); ++it)
        {
            cout << *it << " ";
        }
    	
    	// قد أصبح فارغاً أم لا2 هنا قمنا بطباعة ما إن كان الكائن
        cout << "\nIs second empty? " << ((list2.empty())? "Yes": "No");
    
        return 0;
    }
    		

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

    First values = 1 2 3 4 5 6 7 8
    Is second empty? Yes
    		


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

    ملاحظة: قمنا باستخدام الدالة sort() لترتيب عناصر الكائن من الأصغر إلى الأكبر و الدالة unique() من بعدها لإبقاء نسخة واحدة فقط من العناصر التي تملك نفس القيمة.

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

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

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

    values = 1 2 3 4 5
    		


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

    ملاحظة: قمنا باستخدام الدالة remove() لحذف العناصر التي تملك قيمة محددة ألا و هي 0 و الدالة remove_if() لحذف العناصر في حال كانت قيمتها أكبر من 3.

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

    main.cpp
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    // سنستخدمها لاحقاً عند التشييك على قيم العناصر التي يجب حذفها أم لا shouldBeRemoved هنا قمنا بتعريف دالة إسمها
    bool shouldBeRemoved(const int& value)
    {
    	// لإعلام المترجم أنه يجب حذف العنصر من الكائن الذي قام باستدعائها true هنا قلنا أن أي عنصر تكون قيمته أكبر من 3 سترجع الدالة
    	if (value > 3)
    	{
    		return true;
    	}
    	
    	// لإعلام المترجم أنه يجب عدم حذف العنصر من الكائن الذي قام باستدعائها false في حال لم تكن قيمة العنصر أكبر من 3 سيتم إرجاع القيمة
    	return false;
    }
    
    // main() هنا قمنا بتعريف الدالة
    int main()
    {
        // بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها هنا قمنا بتعريف كائن من الكلاس
       <int> my= {1, 0, 3, 2, 0, 0, 4, 2, 5, 0, 1, 5};
    	
    	// هنا قمنا بحذف كل عنصر قيمته تساوي 0
    	// {1, 3, 2, 4, 2, 5, 1, 5} أصبح فيه القيم التالية myإذاً الكائن
    	myList.remove(0);
    	
    	// لها shouldBeRemoved و تمرير إسم الدالة myمن الكائن remove_if() هنا قمنا باستدعاء الدالة
    	// shouldBeRemoved لإعلام المترجم أننا نريد التشييك على قيم العناصر التي نريد حذفها من خلال الدالة
    	// و هي من ستقرر ما إن كان يجب حذفه أم لا shouldBeRemoved سيتم تمريره للدالة myإذاً كل عنصر  في الكائن
    	// {1, 3, 2, 2, 1} أصبح فيه القيم التالية myإذاً الكائن
    	myList.remove_if(shouldBeRemoved);
    	
        cout << "values = ";
    
    	// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
        for (auto it = myList.begin(); it != myList.end(); ++it)
        {
            cout << *it << " ";
        }
    
        return 0;
    }
    		

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

    values = 1 3 2 2 1
    		




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

    ملاحظة: قمنا باستخدام الدالة pop_front() لحذف عنصر من أول الكائن, الدالة pop_back() لحذف عنصر من آخر الكائن. عند عرض جميع قيم عناصر الكائن, قمنا باستخدام الدالة rbegin() للحصول على مؤشر للعنصر الأخير لأننا سنبدأ من عنده و الدالة rend() للحصول على مؤشر للعنصر الأول لأننا سنتوقف عنده.

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

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

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

    values in descending order = 4 3 2
    		
    إعلان

    Eqla3Tech.com

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

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

    الدورات

    أدوات مساعدة

    الأقسام

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