نظرة عامة وفلسفة STL
جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 70 من 104.
تعد مكتبة القوالب القياسية (STL) مجموعة من الفئات والدوال المبنية على القوالب والتي توفر هياكل بيانات وخوارزميات شائعة. وبناءً على مفاهيم القوالب التي تعلمتها، تجسد STL فلسفة تصميم قوية: فصل تخزين البيانات عن معالجتها.
تُنظم مكتبة STL حول ثلاثة مكونات أساسية تعمل معاً:
| المكون | الغرض | أمثلة |
|---|---|---|
| الحاويات (Containers) | تخزين مجموعات من الكائنات | vector, map, set |
| المكررات (Iterators) | توفير الوصول إلى عناصر الحاوية | الإدخال، الإخراج، الوصول العشوائي |
| الخوارزميات (Algorithms) | إجراء العمليات على البيانات | sort, find, transform |
الفكرة الجوهرية هي أن الخوارزميات لا تعرف عن الحاويات بشكل مباشر - بل تعمل من خلال المكررات (iterators). وهذا يعني أن خوارزمية sort واحدة تعمل مع المتجهات (vectors)، والمصفوفات (arrays)، وأي حاوية توفر نوع المكرر الصحيح:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// المخرجات: 1 2 5 8 9
}هذا الفصل يعني أنه يمكنك المزج والمطابقة - استخدام أي خوارزمية مع أي حاوية متوافقة دون كتابة كود جديد. توفر STL تطبيقات محسنة ومختبرة بدقة حتى تتمكن من التركيز على حل المشكلات بدلاً من إعادة اختراع هياكل البيانات الشائعة.
التحدي
سهللنقم ببناء نظام بسيط لمعالجة البيانات يوضح فلسفة STL في فصل الحاويات (containers)، والمكررات (iterators)، والخوارزميات (algorithms). ستقوم بإنشاء وحدة برمجية مساعدة تعمل مع مكونات STL وبرنامج رئيسي يوضح كيفية ترابط هذه الأجزاء معاً.
ستقوم بإنشاء ملفين:
DataProcessor.h: تحديد دوال مساعدة تعمل مع حاويات STL من خلال المكررات، مما يوضح فلسفة تصميم STL.قم بإنشاء دالة تسمى
printVectorتأخذstd::vector<int>&وتطبع جميع العناصر مفصولة بمسافات، متبوعة بسطر جديد. استخدم المكررات (begin()وend()) للتنقل عبر الحاوية.قم بإنشاء دالة تسمى
sortAndPrintتأخذstd::vector<int>&، وتقوم بفرزها باستخدامstd::sort، ثم تطبع العناصر المفروزة مفصولة بمسافات متبوعة بسطر جديد.قم بإنشاء دالة تسمى
findElementتأخذstd::vector<int>&وقيمةintللبحث عنها. استخدمstd::findلتحديد موقع العنصر. إذا تم العثور عليه، اطبعFound: <value>. إذا لم يتم العثور عليه، اطبعNot found: <value>.قم بإنشاء دالة تسمى
getSumتأخذstd::vector<int>&وتعيد مجموع كل العناصر. يمكنك استخدام حلقة بسيطة مع المكررات لهذا الغرض.main.cpp: قراءة المدخلات وتوضيح كيفية عمل مكونات STL معاً.اقرأ خمسة مدخلات (كل منها في سطر منفصل):
- العدد الصحيح الأول
- العدد الصحيح الثاني
- العدد الصحيح الثالث
- العدد الصحيح الرابع
- قيمة للبحث عنها
قم بإنشاء
std::vector<int>وأضف الأعداد الصحيحة الأربعة الأولى إليه. ثم وضح فلسفة STL من خلال:- طباعة
Original:متبوعة باستدعاءprintVector - طباعة
Sorted:متبوعة باستدعاءsortAndPrint - استدعاء
findElementمع قيمة البحث - طباعة
Sum: <result>باستخدامgetSum
على سبيل المثال، مع المدخلات 5، 2، 8، 1، و 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16مع المدخلات 10، 30، 20، 40، و 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100لاحظ كيف تعمل دوالك مع المتجه (vector) من خلال المكررات، وكيف تعمل std::sort و std::find على أي حاوية توفر نوع المكرر الصحيح. هذه هي قوة تصميم STL — الخوارزميات منفصلة عن الحاويات، ومرتبطة فقط من خلال المكررات.
ورقة مرجعية
تعد مكتبة القوالب القياسية (STL) مجموعة من الفئات والوظائف القائمة على القوالب التي توفر هياكل بيانات وخوارزميات شائعة. وهي تفصل بين تخزين البيانات ومعالجتها.
تتكون مكتبة STL من ثلاثة مكونات أساسية:
| المكون | الغرض | أمثلة |
|---|---|---|
| الحاويات (Containers) | تخزين مجموعات من الكائنات | vector، map، set |
| المكررات (Iterators) | توفير الوصول إلى عناصر الحاوية | الإدخال، الإخراج، الوصول العشوائي |
| الخوارزميات (Algorithms) | إجراء عمليات على البيانات | sort، find، transform |
تعمل الخوارزميات من خلال المكررات، وليس مباشرة مع الحاويات. يتيح ذلك لخوارزمية واحدة العمل مع أي حاوية متوافقة:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Sort using iterators
// الفرز باستخدام المكررات
std::sort(nums.begin(), nums.end());
// Traverse using iterators
// التنقل باستخدام المكررات
for (int n : nums) {
std::cout << n << " ";
}
// Output: 1 2 5 8 9
// المخرجات: 1 2 5 8 9
}طرق المكررات الشائعة:
begin()- تعيد مكرراً إلى العنصر الأولend()- تعيد مكرراً إلى الموضع الذي يلي العنصر الأخير
خوارزميات STL الشائعة:
std::sort(begin, end)- تفرز العناصر في نطاق معينstd::find(begin, end, value)- تبحث عن قيمة في نطاق معين
جرّب بنفسك
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// قراءة خمسة أعداد صحيحة من المدخلات
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: إنشاء vector وإضافة أول أربعة أعداد صحيحة إليه
// TODO: طباعة "Original: " واستدعاء printVector
// TODO: طباعة "Sorted: " واستدعاء sortAndPrint
// TODO: استدعاء findElement مع searchValue
// TODO: طباعة "Sum: " متبوعة بنتيجة getSum
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامة