Menu
Coddy logo textTech

סקירה כללית והפילוסופיה של STL

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 70 מתוך 104.

ספריית התבניות הסטנדרטית (STL) היא אוסף של מחלקות ופונקציות המבוססות על תבניות, המספקות מבני נתונים ואלגוריתמים נפוצים. ה-STL, שנבנתה על בסיס מושגי התבניות שלמדת, מגלמת פילוסופיית תכנון רבת־עוצמה: הפרדת אחסון הנתונים מעיבוד הנתונים.

ה־STL מאורגן סביב שלושה רכיבים מרכזיים שפועלים יחד:

רכיבמטרהדוגמאות
מכולותמאחסנות אוספים של אובייקטיםvector, map, set
איטרטוריםמספקים גישה לאיברים במכולהקלט, פלט, גישה אקראית
אלגוריתמיםמבצעים פעולות על נתוניםsort, find, transform

התובנה המרכזית היא שאלגוריתמים אינם מכירים ישירות את המכלים — הם פועלים באמצעות איטרטורים. פירוש הדבר הוא שאלגוריתם sort יחיד פועל עם וקטורים, מערכים וכל מכל שמספק את סוג האיטרטור המתאים:

#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 של הפרדת מכלים, איטרטורים ואלגוריתמים. תיצור מודול שירות שעובד עם רכיבי 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

שים לב כיצד הפונקציות שלך עובדות עם הווקטור באמצעות איטרטורים, וכיצד std::sort ו-std::find פועלות על כל מכל שמספק את סוג האיטרטור המתאים. זהו כוחה של פילוסופיית התכנון של STL: האלגוריתמים מנותקים מהמכלים ומקושרים אליהם רק באמצעות איטרטורים.

נסו בעצמכם

#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: צור וקטור והוסף אליו את ארבעת המספרים השלמים הראשונים
    
    // TODO: הדפס "Original: " וקרא ל-printVector
    
    // TODO: הדפס "Sorted: " וקרא ל-sortAndPrint
    
    // TODO: קרא ל-findElement עם הערך לחיפוש
    
    // TODO: הדפס "Sum: " ואחריו את התוצאה של getSum
    
    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C++ אונליין