הסרת איברים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 13 מתוך 66.
לפעמים צריך להסיר איברים מווקטור, ולא רק להוסיף אותם. Rust מספקת שתי שיטות עיקריות להסרת איברים, וכל אחת מיועדת למצבים שונים.
השיטה .pop() מסירה ומחזירה את האיבר האחרון מהווקטור:
let mut numbers = vec![10, 20, 30, 40];
let last = numbers.pop(); // מסיר את 40, מחזיר Some(40)
// numbers מכיל כעת [10, 20, 30]שימו לב ש-.pop() מחזירה Option — היא נותנת לכם Some(value) אם היה איבר להסיר, או None אם הווקטור כבר היה ריק. כך בטוח להשתמש בה גם בווקטורים ריקים.
המתודה .remove() מסירה איבר באינדקס מסוים ומחזירה את אותו איבר:
let mut fruits = vec!["apple", "banana", "cherry"];
let removed = fruits.remove(1); // מסיר את "banana"
// fruits מכיל כעת את ["apple", "cherry"]כשמשתמשים ב־.remove(), כל האיברים שאחרי האינדקס שהוסר זזים שמאלה כדי למלא את הפער. הפעולה הזאת עשויה להיות איטית יותר עבור וקטורים גדולים כשמסירים איבר מתחילת הווקטור או מאמצעו, מכיוון שיש להזיז איברים רבים.
לשתי השיטות נדרש שהווקטור יהיה ניתן לשינוי, מכיוון שהן משנות את התוכן שלו. בחרו ב-.pop() כשרוצים להסיר מהסוף, וב-.remove() כשצריך להסיר ממיקום מסוים.
אתגר
קלתקבל שתי קלטים: הראשון הוא רשימת מספרים מופרדת בפסיקים, והשני הוא אינדקס להסרה. קרא את שני הקלטים, צור וקטור מהמספרים, הסר את האיבר באינדקס שצוין, והדפס את האיברים שנותרו בשורות נפרדות.
דרישות:
- קרא את הקלט הראשון שמכיל מספרים מופרדים בפסיקים (למשל,
10,20,30,40,50) - פצל את המחרוזת לפי פסיקים והמר כל מספר למספר שלם
- צור וקטור שניתן לשנות מהמספרים האלה
- קרא את הקלט השני והמר אותו למספר שלם שמייצג את האינדקס
- השתמש ב-
.remove()כדי להסיר את האיבר באינדקס הזה - הדפס כל איבר שנותר בשורה נפרדת
קלט:
- שורה ראשונה: מספרים שלמים מופרדים בפסיקים (למשל,
10,20,30,40,50) - שורה שנייה: מספר שלם שמייצג את האינדקס להסרה
פלט: הדפס כל איבר שנותר בווקטור בשורה נפרדת
נסו בעצמכם
use std::io;
fn main() {
// קראו את המספרים המופרדים בפסיקים
let mut numbers_input = String::new();
io::stdin().read_line(&mut numbers_input).expect("Failed to read line");
// קראו את האינדקס של האיבר שיש להסיר
let mut index_input = String::new();
io::stdin().read_line(&mut index_input).expect("Failed to read line");
// TODO: כתבו את הקוד שלכם למטה
// 1. פצלו את numbers_input לפי פסיקים והמירו את הערכים למספרים שלמים
// 2. צרו וקטור שניתן לשינוי מהמספרים האלה
// 3. המירו את index_input למספר שלם
// 4. הסירו את האיבר באינדקס שצוין
// 5. הדפיסו כל איבר שנותר בשורה נפרדת
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מיליםתרגלו בעצמכם: קומפיילר Rust אונליין