הסרת איברים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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(), ובדיקה של המקרה הזה מונעת שגיאות.
התבנית הזאת הופכת הסרת איברים לבטוחה וצפויה. היא שימושית במיוחד לתחזוקה של אוספים דינמיים שבהם צריך להסיר פריטים מסוימים על סמך קלט מהמשתמש או לוגיקה של התוכנית. חשוב לזכור לבדוק תמיד אם האיטרטור תקף לפני שמוחקים.
אתגר
קלצרו תוכנית שמדגימה הסרה של איברים מ־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++ אונליין