Menu
CoddyTech

הסרת איברים

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

לפעמים צריך להסיר איברים מווקטור כשהם כבר לא נחוצים. כדי להשתמש בשיטה .erase() בווקטורים, צריך להשתמש באיטרטור. אפשר לשלב את std::find() עם .erase() כדי להסיר איברים לפי ערך.

כך מסירים איבר מווקטור. std::find() מגיעה מהכותרת <algorithm>, לכן יש לכלול אותה יחד עם <vector>:

#include <algorithm>
#include <vector>
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
    numbers.erase(it);  // מסיר את האיבר במיקום של האיטרטור
}

לאחר קריאה ל־erase(), האיבר במיקום הזה מוסר וכל האיברים שאחריו זזים מטה. אם תנסה למצוא ולמחוק איבר שאינו קיים, find() תחזיר end(), ובדיקה של המקרה הזה מונעת שגיאות.

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

challenge icon

אתגר

קל

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

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

  • מספר שלם n המייצג את מספר האיברים שיש להוסיף תחילה למערך הווקטורי
  • לאחר מכן n מספרים שלמים שיש להכניס למערך הווקטורי
  • מספר שלם m המייצג את מספר האיברים שיש להסיר
  • לאחר מכן m מספרים שלמים המייצגים את האיברים שיש להסיר מהמערך הווקטורי

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

  1. ליצור std::vector<int> ריק
  2. לקרוא את מספר האיברים שיש להוסיף ולהכניס אותם למערך הווקטורי באמצעות .push_back()
  3. להדפיס את הגודל ההתחלתי של המערך הווקטורי לאחר כל ההכנסות
  4. לקרוא את מספר האיברים שיש להסיר
  5. עבור כל איבר שיש להסיר, להשתמש ב־std::find() כדי למצוא אותו, ואז להשתמש ב־.erase() כדי להסיר אותו אם נמצא
  6. לאחר כל ניסיון הסרה, להדפיס את הגודל הנוכחי של המערך הווקטורי
  7. לבסוף, לעבור על האיברים שנותרו במערך הווקטורי ולהדפיס אותם לפי הסדר

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

הגודל ההתחלתי של המערך הווקטורי:

Initial size: [size]

לאחר כל ניסיון הסרה:

After removing [number]: size = [current_size]

האיברים שנותרו בסוף:

Remaining elements: [element1] [element2] [element3] ...

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

נסו בעצמכם

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

int main() {
    // קרא את מספר האיברים להוספה
    int n;
    cin >> n;
    
    // צור וקטור ריק
    vector<int> myVector;
    
    // קרא והכנס n איברים
    for (int i = 0; i < n; i++) {
        int element;
        cin >> element;
        // הכנס איבר לווקטור
    }
    
    // קרא את מספר האיברים להסרה
    int m;
    cin >> m;
    
    // TODO: כתוב את הקוד שלך להלן
    // 1. הדפס את הגודל ההתחלתי של הווקטור
    // 2. עבור כל איבר שיש להסיר, מצא אותו, השתמש ב-.erase() והדפס את הגודל לאחר כל הסרה
    // 3. הדפס את האיברים שנותרו בווקטור
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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