أمثلة شاملة حول التعامل مع الكلاس forward_list
في كل مثال موضوع قمنا باستخدام دوال جديدة حتى تعرف كيف تستخدم جميع الدوال التي ذكرناها في الجدول.
في المثال التالي قمنا بتعريف كائن من forward_list
مع تحديد أنه يمكن أن يحتوي على عناصر نوعها int
.
بعدها قمنا بإضافة 5 قيم فيه بطرق مختلفة و من ثم عرض جميع قيمه باستخدام حلقة.
ملاحظة: قمنا باستخدام الدالة assign()
لإضافة مجموعة من العناصر فيه دفعة واحدة, الدالة push_front()
لإضافة عنصر واحد في بدايته و الدالة emplace_front()
لإضافة عنصر واحد في بدايته أيضاً. عند عرض جميع قيم عناصر الكائن, قمنا باستخدام الدالة begin()
للحصول على مؤشر للعنصر الأول لأننا سنبدأ من عنده و الدالة end()
للحصول على مؤشر للعنصر الأخير لأننا سنتوقف عنده.
المثال الأول
main.cpp
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
// int يمكنه أن يحتوي على قيم نوعها forward_هنا قمنا بتعريف كائن من الكلاس
forward_list<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);
cout << "values = ";
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
for (auto it = myList.begin(); it != myList.end(); ++it)
{
cout << *it << " ";
}
return 0;
}
سنحصل على النتيجة التالية عند التشغيل.
values = 1 2 3 4 5
في المثال التالي قمنا بتعريف دالة إسمها printList()
عند استدعائها نمرر لها كائن من forward_list
فتقوم بطباعة كل قيم عناصره حتى لا نقوم بتكرار نفس الكود كلما أردنا طباعة قيم عناصر الكائن.
بعدها قمنا بتعريف كائن من forward_list
مخصص لتخزين قيم نوعها int
مع إضافة 5 قيم فيه عند تعريفه.
بعدها قمنا بعرض القيم الموجودة فيه كما هي, ثم ترتيبها من الأصغر إلى الأكبر و عرضها, ثم ترتيبها بشكل عكسي و عرضها.
ملاحظة: قمنا باستخدام الدالة sort()
لترتيب عناصر الكائن من الأصغر إلى الأكبر و الدالة reverse()
لعكس ترتيب العناصر.
المثال الثاني
main.cpp
#include <iostream>
#include <forward_list>
using namespace std;
// فتقوم بطباعة القيم الموجودة فيه forward_عند استدعائها نمرر لها كائن من printهنا قمنا بتعريف دالة إسمها
void printList(forward_list<int> &aList)
{
// إبتداءاً من أول عنصر وصولاً لآخر عنصر فيه myهنا قمنا بإنشاء حلقة تقوم في كل دورة بطباعة قيمة عنصر جديد من العناصر الموجودة في الكائن
for (auto it = aList.begin(); it != aList.end(); ++it)
{
cout << *it << " ";
}
}
// main() هنا قمنا بتعريف الدالة
int main()
{
// بالإضافة إلى أننا قمنا بإضافة 5 قيم فيه int يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس
forward_list<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
في المثال التالي قمنا بتعريف كائنين من forward_list
في كل منهما 4 عناصر من النوع نوعها int
.
بعدها قمنا بدمج الكائنين في كائن واحد حيث قمنا بنقل العناصر الموجودة في الكائن الثاني إلى الكائن الأول.
في النهاية قمنا بطباعة القيم التي أصبحت موجودة في الكائن الأول, و ما إن كان الكائن الثاني قد أصبح فارغاً أم لا.
ملاحظة: قمنا باستخدام الدالة merge()
لنقل العناصر من كائن لآخر و الدالة empty()
لمعرفة ما إن كان الكائن قد أصبح فارغاً أم لا.
المثال الثالث
main.cpp
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
// int يحتوي كل منهما على 4 عناصر نوعها forward_هنا قمنا بتعريف كائنين من الكلاس
forward_list<int>1 = {1, 2, 3, 4};
forward_list<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
في المثال التالي قمنا بتعريف كائن من forward_list
مخصص لتخزين قيم نوعها int
مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بإزالة العناصر الموجودة فيه و التي تملك قيم مكررة.
في الأخير قمنا بعرض القيم الموجودة فيه كما هي.
ملاحظة: قمنا باستخدام الدالة sort()
لترتيب عناصر الكائن من الأصغر إلى الأكبر و الدالة unique()
من بعدها لإبقاء نسخة واحدة فقط من العناصر التي تملك نفس القيمة.
المثال الرابع
main.cpp
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
// بالإضافة إلى أننا قمنا بإضافة عدة قيم فيه int يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس
forward_list<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
في المثال التالي قمنا بتعريف كائن من forward_list
مخصص لتخزين قيم نوعها int
مع إضافة عدة قيم فيه عند تعريفه.
بعدها قمنا بحذف أي عنصر يملك قيمة تساوي 0
و من ثم قمنا بحذف أي قيمة أكبر من 3
.
في الأخير قمنا بعرض القيم الموجودة فيه كما هي.
ملاحظة: قمنا باستخدام الدالة remove()
لحذف العناصر التي تملك قيمة محددة ألا و هي 0
و الدالة remove_if()
لحذف العناصر في حال كانت قيمتها أكبر من 3
.
المثال الخامس
main.cpp
#include <iostream>
#include <forward_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 يمكنه أن يحتوي على عناصر نوعها forward_هنا قمنا بتعريف كائن من الكلاس
forward_list<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