סקירה כללית והפילוסופיה של 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 מספקת מימושים יעילים שנבחנו היטב, כך שתוכל להתמקד בפתרון בעיות במקום להמציא מחדש מבני נתונים נפוצים.
אתגר
קלבואו נבנה מערכת פשוטה לעיבוד נתונים שמדגימה את פילוסופיית ה-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 עובדים יחד.קרא חמישה קלטים (כל אחד בשורה נפרדת):
- המספר השלם הראשון
- המספר השלם השני
- המספר השלם השלישי
- המספר השלם הרביעי
- ערך לחיפוש
צור
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שים לב כיצד הפונקציות שלך עובדות עם הווקטור באמצעות איטרטורים, וכיצד 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;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים10סקירה כללית של STL
סקירה כללית והפילוסופיה של STLקונטיינרים של STLאיטרטוריםאלגוריתמים של STLפונקטורים וביטויי למבדהסיכום – תדירות מילים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין