Menu
Coddy logo textTech

מיון באמצעות Lambda

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 47 מתוך 56.

הספרייה הסטנדרטית של C++ מספקת פונקציה עוצמתית בשם std::sort מהכותרת <algorithm>, שיכולה למיין מכלים כמו וקטורים.

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

#include <vector>
#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// מיין בסדר יורד באמצעות למבדה
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // החזר true אם a צריך להופיע לפני b
});

הלמבדה מקבלת שני פרמטרים שמייצגים את האיברים המושווים, ומחזירה true אם האיבר הראשון אמור להופיע לפני השני בתוצאה הממוינת. בסדר יורד, מחזירים true כאשר a > b, וכך המספרים הגדולים יותר מופיעים ראשונים.

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

challenge icon

אתגר

קל

צרו תוכנית המדגימה מיון מותאם אישית באמצעות ביטויי lambda עם std::sort. האתגר הזה יבדוק את ההבנה שלכם כיצד להשתמש בפונקציות lambda כדי להגדיר לוגיקת השוואה מותאמת אישית למיון מכלים.

הקלטים הבאים יסופקו:

  • מספר שלם n המייצג את מספר האיברים בווקטור
  • n מספרים שלמים המייצגים את האיברים שיש למיין
  • תו order המייצג את סדר המיון (A לסדר עולה, D לסדר יורד)

על התוכנית שלכם:

  1. ליצור std::vector<int> ולאכלס אותו במספרים שהתקבלו בקלט
  2. להשתמש ב-std::sort מהכותרת <algorithm> יחד עם ביטוי lambda כדי למיין את הווקטור
  3. על ה-lambda לקבל שני פרמטרים של מספרים שלמים ולהחזיר ערך בוליאני
  4. בהתאם לתו הסדר, לממש ב-lambda את לוגיקת ההשוואה המתאימה
  5. להדפיס כל איבר מהווקטור הממוין בשורה נפרדת

התנהגות המיון צריכה להיות:

  • אם order הוא A: למיין בסדר עולה (מהקטן לגדול)
  • אם order הוא D: למיין בסדר יורד (מהגדול לקטן)

השתמשו בפורמט הפלט המדויק הבא:

[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]

זכרו ש-std::sort מקבלת שלושה פרמטרים: איטרטור לתחילת הטווח, איטרטור לסוף הטווח ופונקציית השוואה. השתמשו ב-vector.begin() וב-vector.end() עבור האיטרטורים. פונקציית ההשוואה של ה-lambda צריכה להחזיר true אם הפרמטר הראשון צריך להופיע לפני הפרמטר השני בתוצאה הממוינת. עבור סדר עולה, החזירו a < b; עבור סדר יורד, החזירו a > b.

נסו בעצמכם

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // קראו את הקלט
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: כתבו את הקוד שלכם למטה
    // השתמשו ב-std::sort עם ביטוי למבדה כדי למיין את הווקטור
    // בהתאם לתו הקובע את סדר המיון (A לסדר עולה, D לסדר יורד)
    
    // הדפיסו את האיברים הממוינים
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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