أمثلة شاملة حول التعامل مع الكلاس 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