Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نظرة عامة وفلسفة 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 تطبيقات محسنة ومختبرة بدقة حتى تتمكن من التركيز على حل المشكلات بدلاً من إعادة اختراع هياكل البيانات الشائعة.

challenge icon

التحدي

سهل

لنقم ببناء نظام بسيط لمعالجة البيانات يوضح فلسفة 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 معاً.

    اقرأ خمسة مدخلات (كل منها في سطر منفصل):

    1. العدد الصحيح الأول
    2. العدد الصحيح الثاني
    3. العدد الصحيح الثالث
    4. العدد الصحيح الرابع
    5. قيمة للبحث عنها

    قم بإنشاء std::vector<int> وأضف الأعداد الصحيحة الأربعة الأولى إليه. ثم وضح فلسفة STL من خلال:

    1. طباعة Original: متبوعة باستدعاء printVector
    2. طباعة Sorted: متبوعة باستدعاء sortAndPrint
    3. استدعاء findElement مع قيمة البحث
    4. طباعة 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming