מיון באמצעות 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, וכך המספרים הגדולים יותר מופיעים ראשונים.
הדבר מדגים כיצד פונקציות למבדה מקלות על התאמה אישית של פונקציות מהספרייה הסטנדרטית בלי לכתוב פונקציות השוואה נפרדות, כך שהלוגיקה של המיון נשארת בדיוק במקום שבו היא נחוצה.
אתגר
קלצרו תוכנית המדגימה מיון מותאם אישית באמצעות ביטויי lambda עם std::sort. האתגר הזה יבדוק את ההבנה שלכם כיצד להשתמש בפונקציות lambda כדי להגדיר לוגיקת השוואה מותאמת אישית למיון מכלים.
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר האיברים בווקטור nמספרים שלמים המייצגים את האיברים שיש למיין- תו
orderהמייצג את סדר המיון (Aלסדר עולה,Dלסדר יורד)
על התוכנית שלכם:
- ליצור
std::vector<int>ולאכלס אותו במספרים שהתקבלו בקלט - להשתמש ב-
std::sortמהכותרת<algorithm>יחד עם ביטוי lambda כדי למיין את הווקטור - על ה-lambda לקבל שני פרמטרים של מספרים שלמים ולהחזיר ערך בוליאני
- בהתאם לתו הסדר, לממש ב-lambda את לוגיקת ההשוואה המתאימה
- להדפיס כל איבר מהווקטור הממוין בשורה נפרדת
התנהגות המיון צריכה להיות:
- אם
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים4מפות (זוגות מפתח-ערך)
היכרות עם std::mapיצירת מפהגישה לערכים ושינויםבדיקה אם מפתחות קיימיםהסרת זוגותמעבר על מפהסיכום – שכיחות מילים7פונקציות מתקדמות
העברה לפי הפניהמבוא לביטויי LambdaLambda עם פרמטריםLambda עם ערכי החזרהמבוא לרקורסיהעצרת רקורסיביתמיון באמצעות Lambda2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין