חזור לתיקייה: גליון 3

חלק יבש

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • 3.1 - שאלות על SortedList
  • 3.1.1 - דרישות על הטיפוס T
  • 3.1.2 - בעיות במימוש איטרטור לא const
  • 3.1.3 - סינון רשימת מספרים שלמים

חלק יבש

02340124

מבוא לתכנות מערכות

רשימות הרצאה לקריאה בשבת

חלק יבש

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

3.1 - שאלות על SortedListSortedListSortedList

3.1.1 - דרישות על הטיפוס TTT

הדרישות ההכרחיות היחידות שT צריך לקיים הם:

  • קיום בנאי העקה. הסיבה לכך היא שיהיה ניתן לממש בנאי העתקה והשמה במחלקה SortedListSortedListSortedList. בלי בנאי העתקה, לא יהיה ניתן לקבל רשימה ולהעתיק את כל הערכים בה לרשימה אחרת.
  • קיום אופרטור גדול מ-(">>>"). המחלקה SortedListSortedListSortedList מבוססת על כך שיהיה ניתן להשוות בין ערכים על מנת שהיא תוכל לשמור על הסדר בין ערכיה.

3.1.2 - בעיות במימוש איטרטור לא constconstconst

היה עלול להיווצר מצב שבו המשתמש ישנה את הערך TTT שבאיטרטור, ובכך יוכל לגרום לתקלה במיון של הרשימה. לדוגמא אם מדובר ברשימת המספרים 5,4,3,2,15,4,3,2,15,4,3,2,1 המשתמש יוכל לשנות את הערך השלישי ל-101010, ואז הרשימה תהיה 5,4,10,2,15,4,10,2,15,4,10,2,1 ולאבד את הסדר של הרשימה.

3.1.3 - סינון רשימת מספרים שלמים

הפונקציה filterfilterfilter מקבלת פרדיקט בתור function  objectfunction\; objectfunctionobject ומשתמשת בו על מנת ליצור רשימה חדשה המורכבת אך ורק מהערכים ברשימה המקורית עבורם הפרדיקט החזיר truetruetrue.
הרשימה החדשה הזו מוחזרת למשתמש by  valueby\; valuebyvalue.

מכיוון שהשתמשנו ב-function  objectfunction\; objectfunctionobject נוכל לממש את המיון של המספרים השלמים בשתי דרכים:

  1. ניצור מחלקה אשר לה יהיה אופרטור ()()() כך:
    class DividedBy {
     public:
     	DividedBy(int n) : n(n) { }
     	
     	bool operator()(int k) {
     		return (k % n == 0);
     	}
     private:
     	int n;
    };
    
    כעת, נוכל לשלוח אובייקט בנוי מהמחלקה עם המספר nnn שאינו צריך להיות ידוע בזמן קומפילציה.
  2. נוכל להשתמש בפונקציות lambdalambdalambda שילכדו משתנה כלשהו שיאחסן את הערך שאנו רוצים לבדוק חלוקה אליו ונשלח אותה לפונקציה כך:
    int x;
    SortedList<int> list;
    
    // ...
    
    list.filter([x](int n) { return (n % x == 0); });