C++الحاويات الديناميكية (STL Components)
- مفهوم STL
- الحاويات الدينامكية
- الكلاسات الموجودة في STL
مفهوم STL
STL هي إختصار لجملة Standard Template Library و هي عبارة عن مكتبة ضخمة تحتوي على دوال و كلاسات جاهزة تستخدم لتخزين مجموعة من القيم بشكل مرن جداً يجعل التعامل معها سهل للغاية من ناحية إضافة عناصر فيها, حذف عناصر منها, تحديث قيم عناصرها, ترتيب عناصرها و البحث فيها. و هي تتضمن الأشياء التالية:
- حاويات (Containers).
- خوارزميات (Algorithms).
- دوال (Functions).
- متواليات (Iterators).
في هذا الدرس سنتعرف على جميع أنواع الحاويات الموجودة في هذه المكتبة و ستتعلم كيفية التعامل معها بتفصيل ممل.
الحاويات الدينامكية
الحاويات تنقسم لأربع فئات أساسية من ناحية الطريقة التي يتم فيها تخزين البيانات و من ثم إمكانية الوصول لها و كل فئة تحتوي على مجموعة كلاسات كالتالي.
1- مفهوم Sequence Containers
الحاوية التي تندرج تحت هذا النوع يقصد بها أن الحاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض مع إعطاء كل عنصر منهم رقم Index و كأنها مصفوفة عادية.
2- مفهوم Container Adaptors
الحاوية التي تندرج تحت هذا النوع يقصد بها أن الحاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض مع القدرة على الوصول إليها بحسب الترتيب الذي تم فيه إدخالها بأسلوب FIFO أو بأسلوب LIFO أو بحسب الأولوية المعطات لعناصرها.
3- مفهوم Associative Containers
الحاوية التي تندرج تحت هذا النوع يقصد بها أن الحاوية تخزن العناصر التي نضيفها فيها بشكل جدول حيث أن كل عنصر نضيفه فيها يحتوي على مفتاح ( Key ) و قيمة ( Value ) مع الإشارة إلى أنها تخزن المفاتيح بترتيب بشكل أبجدي أو رقمي على حسب نوعها.
4- مفهوم Unordered Associative Containers
الحاوية التي تندرج تحت هذا النوع يقصد بها أن الحاوية تخزن العناصر التي نضيفها فيها على شكل Buckets مما يجعل الوصول إليها سريع جداً.
الفرق بين المصفوفة العادية و الحاوية الدينامكية
المصفوفات العادية تجبرك على تحديد عدد عناصرها لحظة إنشاءها حتى يتم حجز مساحة ثابتة لها في الذاكرة و من بعدها تستطيع التعامل معها.
الحاويات الدينامكية تحجز مساحة في الذاكرة للعنصر الذي تضيفه فيها في ذات اللحظة, و عند حذف عنصر منها تقوم بالتخلي عن المساحة المحجوزة مما يجعل برنامجك أخف على الذاكرة.
المصفوفة العادية نتعامل مع عناصرها فقط من خلال رقم Index العنصر أما في الحاويات الدينامكية فيوجد دوال عديدة نستخدمها للتعامل مع العناصر.
الكلاسات الموجودة في STL
الجدول التالي يحتوي على جميع الكلاسات الموجودة في STL و التي تمثل حاويات دينامكية.
الكلاس مع تعريفه | |
---|---|
1 | array
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل مصفوفة متطورة مقارنةً بالمصفوفة العادية حيث أن التعامل معها مرن أكثر لأنك تستطيع معرفة عدد عناصرها و الحصول على قيمة أول و آخر عنصر فيها بكل سهولة.تابع القراءة |
2 | vector
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض مع إعطاء كل عنصر منهم رقم Index.إذاً يشبه المصفوفة العادية إلى حد ما و لكن الفرق الأساسي بينهما أن حجمه ليس ثابتاً حيث يمكنك إضافة العدد الذي تريده من العناصر فيه وقتما شئت. تابع القراءة |
3 | forward_list
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض مع إعطاء كل عنصر منهم عنوان العنصر الذي يليه في الذاكرة حتى يتم الحفاظ على الترتيب الذي تم فيه تخزينهم.تابع القراءة |
4 | list
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض مع إعطاء كل عنصر منهم عنوان العنصر الذي يسبقه و عنوان العنصر الذي يليه في الذاكرة حتى يتم الحفاظ على الترتيب الذي تم فيه تخزينهم و لتتمكن من التنقل بين العناصر بالإتجاهين; من الأول إلى الآخر و بالعكس.تابع القراءة |
5 | stack
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل فوق بعضها البعض بأسلوب LIFO الذي يعني أن العنصر الذي يدخل أولاً يخرج أخيراً, و هذا يجعلك قادر فقط على التعامل مع العنصر الموجود في أعلاها.تابع القراءة |
6 | queue
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض بأسلوب FIFO الذي يعني أن العنصر الذي يدخل أولاً يخرج أولاً, و هذا يجعلك قادر فقط على التعامل مع العنصر الموجود في آخرها.تابع القراءة |
7 | priority_queue
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و بترتيب معين حيث يتم وضع العنصر الذي يملك القيمة الأكبر في البداية و العنصر الذي يملك القيمة الأصغر في النهاية, بالإضافة إلى أنه يسمح لك بالوصول لأعلى و أدنى قيمة فقط لأنها موجودة على أطراف الحاوية مع إمكانية حذف القيمة الأدنى منها فقط.تابع القراءة |
8 | deque
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل مع إعطاء كل عنصر منهم رقم Index مما يجعلك قادر على الوصول إلى جميع عناصرها و إضافة عناصر جديدة في أي مكان فيها, و يميز هذه الحاوية بأنك قادر على التعامل مع العناصر الموجودة على أطرافها بشكل مباشر.تابع القراءة |
9 | set
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و بترتيب معين حيث يتم وضع العنصر الذي يملك القيمة الأصغر في البداية و العنصر الذي يملك القيمة الأكبر في النهاية أو العكس, مع الإشارة إلى أنه لا يمكن تخزين قيم مكررة فيها.تابع القراءة |
10 | multiset
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل متسلسل وراء بعضها البعض و بترتيب معين حيث يتم وضع العنصر الذي يملك القيمة الأصغر في البداية و العنصر الذي يملك القيمة الأكبر في النهاية أو العكس, مع الإشارة إلى أنه يمكن تخزين قيم مكررة فيها.تابع القراءة |
11 | map
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل جدول يتألف من عمودين حيث يتكون كل عنصر من مفتاح ( Key ) يوضع في العمود الأول و قيمة ( Value ) توضع في العمود الثاني بالإضافة إلى أنها ترتب العناصر بشكل تصاعدي على حسب قيم المفاتيح.تابع القراءة |
12 | multimap
يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل جدول يتألف من عمودين حيث يتكون كل عنصر من مفتاح ( Key ) يوضع في العمود الأول و قيمة ( Value ) توضع في العمود الثاني بالإضافة إلى أنها ترتب العناصر بشكل تصاعدي على حسب قيم المفاتيح مع الإشارة إلى أنه يمكن وضع نفس المفتاح لأكثر من عنصر.تابع القراءة |
13 | unordered_set
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بترتيب معين يتم تحديده من قبل دالة مخصصة لذلك إسمها Hash() تقوم بالتشييك على قيم أي عنصر سيتم إدخاله لتحديد المكان الذي يجب وضعه فيه.تابع القراءة |
14 | unordered_multiset
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بترتيب معين يتم تحديده من قبل دالة مخصصة لذلك إسمها Hash() تقوم بالتشييك على قيم أي عنصر سيتم إدخاله لتحديد المكان الذي يجب وضعه فيه مع الإشارة إلى أنه يمكن تخزين قيم مكررة فيها.تابع القراءة |
15 | unordered_map
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل جدول يتألف من عمودين حيث يتكون كل عنصر من مفتاح ( Key ) يوضع في العمود الأول و قيمة ( Value ) توضع في العمود الثاني بالإضافة إلى أنها ترتب العناصر بالإعتماد على دالة مخصصة لذلك إسمها Hash() تقوم بالتشييك على مفتاح أي عنصر سيتم إدخاله لتحديد المكان الذي يجب وضعه فيها.تابع القراءة |
16 | unordered_multimap
تم إضافة هذا الكلاس إبتداءاً من الإصدر c++11 و هو يستخدم لإنشاء كائن يمثل حاوية تخزن العناصر التي نضيفها فيها بشكل جدول يتألف من عمودين حيث يتكون كل عنصر من مفتاح ( Key ) يوضع في العمود الأول و قيمة ( Value ) توضع في العمود الثاني بالإضافة إلى أنها ترتب العناصر بالإعتماد على دالة مخصصة لذلك إسمها Hash() تقوم بالتشييك على مفتاح أي عنصر سيتم إدخاله لتحديد المكان الذي يجب وضعه فيها مع الإشارة إلى أنه يمكن وضع نفس المفتاح لأكثر من عنصر.تابع القراءة |