הסרת איברים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 16 מתוך 56.
לפעמים צריך להסיר איברים מווקטור כשהם כבר אינם נחוצים. כדי להסיר איברים מווקטורים, צריך להשתמש באיטרטור עם המתודה .erase(). אפשר לשלב את std::find() עם .erase() כדי להסיר איברים לפי ערך.
כך מסירים איבר מווקטור:
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(), ובדיקה של המצב הזה תמנע שגיאות.
התבנית הזאת הופכת הסרת איברים לבטוחה וצפויה. היא שימושית במיוחד לתחזוקת אוספים דינמיים שבהם צריך להסיר פריטים מסוימים על סמך קלט מהמשתמש או לוגיקת התוכנית. חשוב לבדוק תמיד אם האיטרטור תקף לפני שמוחקים.
אתגר
קלצרו תוכנית המדגימה הסרת איברים מתוך std::vector באמצעות המתודה .erase() בשילוב עם std::find(). האתגר הזה יבחן את הבנתכם כיצד להסיר בבטחה איברים מסוימים ממערך וקטורי ולבחון את התוצאות.
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר האיברים שיש להוסיף בתחילה למערך הווקטורי - לאחר מכן
nמספרים שלמים שיש להכניס למערך הווקטורי - מספר שלם
mהמייצג את מספר האיברים שיש להסיר - לאחר מכן
mמספרים שלמים המייצגים את האיברים שיש להסיר מהמערך הווקטורי
התוכנית שלכם צריכה:
- ליצור
std::vector<int>ריק - לקרוא את מספר האיברים שיש להוסיף ולהכניס אותם למערך הווקטורי באמצעות
.push_back() - להדפיס את הגודל ההתחלתי של המערך הווקטורי לאחר כל ההוספות
- לקרוא את מספר האיברים שיש להסיר
- עבור כל איבר שיש להסיר, להשתמש ב־
std::find()כדי לאתר אותו, ואז להשתמש ב־.erase()כדי להסיר אותו אם נמצא - לאחר כל ניסיון הסרה, להדפיס את הגודל הנוכחי של המערך הווקטורי
- לבסוף, לעבור על האיברים שנותרו במערך הווקטורי ולהדפיס אותם לפי הסדר
השתמשו בפורמט הפלט המדויק הבא:
הגודל ההתחלתי של המערך הווקטורי:
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין