הסרת זוגות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 27 מתוך 56.
לפעמים צריך להסיר זוגות מפתח-ערך מהמפה שלך כשהם כבר אינם נחוצים. המתודה .erase() מספקת דרך פשוטה למחיקת איברים באמצעות ציון המפתח שברצונך להסיר.
כדי להסיר איבר ממפה, פשוט קראו ל־.erase() והעבירו את המפתח כארגומנט:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // מסיר לחלוטין את הרשומה של Bobלאחר קריאה ל־erase("Bob"), המפה תכיל רק את הניקוד של Alice ושל Carol. אם תנסה למחוק מפתח שאינו קיים במפה, הפעולה פשוט לא תעשה דבר - לא תתרחש שגיאה.
בעת איטרציה על מפה באמצעות לולאת for מבוססת טווח, כל איבר הוא std::pair המכיל את המפתח ואת הערך. אפשר לגשת למפתח באמצעות .first ולערך באמצעות .second:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}פעולה זו תדפיס כל שם וציון בסדר אלפביתי, מכיוון ש־std::map שומר את המפתחות שלו ממוינים באופן אוטומטי.
השיטה הזו שימושית במיוחד לשמירה על מבני נתונים נקיים, להסרת מידע מיושן או למימוש תכונות שמאפשרות למשתמשים למחוק רשומות מהיישום שלך.
אתגר
קלצרו תוכנית לניהול ספר טלפונים באמצעות std::map. התוכנית שלכם תשמור שמות של אנשי קשר ומספרי טלפון, ואז תאפשר למשתמשים להסיר אנשי קשר מסוימים מספר הטלפונים באמצעות המתודה .erase().
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר אנשי הקשר ההתחלתיים - לאחר מכן
nזוגות של קלטים:- מחרוזת המייצגת את שם איש הקשר
- מחרוזת המייצגת את מספר הטלפון
- מספר שלם
mהמייצג את מספר אנשי הקשר להסרה - לאחר מכן
mמחרוזות המייצגות שמות של אנשי קשר להסרה
התוכנית שלכם צריכה:
- ליצור
std::map<std::string, std::string>בשםcontacts - לקרוא את מספר אנשי הקשר ההתחלתיים ולאכלס את המפה בשמות של אנשי קשר ובמספרי טלפון
- להדפיס את ספר הטלפונים הראשוני בפורמט המוצג להלן
- לקרוא את מספר אנשי הקשר להסרה
- עבור כל שם של איש קשר להסרה, להשתמש במתודה
.erase()כדי להסיר אותו מהמפה - להדפיס את ספר הטלפונים המעודכן לאחר כל ההסרות
השתמשו בפורמט הפלט המדויק הבא:
ספר הטלפונים הראשוני:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...ספר הטלפונים המעודכן לאחר ההסרות:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...אם ספר הטלפונים מתרוקן לאחר כל ההסרות, הדפיסו:
Updated Contact Directory:
Directory is emptyיש להדפיס את אנשי הקשר לפי הסדר שבו הם מופיעים בעת מעבר על המפה (בסדר אלפביתי לפי שם איש הקשר). השתמשו בלולאת for מבוססת טווח כדי לעבור על המפה בשתי הפעמים, תוך גישה לכל זוג מפתח-ערך באמצעות pair.first עבור שם איש הקשר ו-pair.second עבור מספר הטלפון. זכרו שניסיון למחוק איש קשר שאינו קיים לא יגרום לשגיאה — המפה פשוט תישאר ללא שינוי.
נסו בעצמכם
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// קרא את מספר אנשי הקשר ההתחלתיים
int n;
cin >> n;
// צור את מפת אנשי הקשר
map<string, string> contacts;
// קרא את אנשי הקשר ההתחלתיים
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: הוסף איש קשר למפה
}
// הדפס את ספר הטלפונים ההתחלתי
cout << "Initial Contact Directory:" << endl;
// TODO: הדפס את כל אנשי הקשר באמצעות לולאת for מבוססת-טווח
// קרא את מספר אנשי הקשר שיש להסיר
int m;
cin >> m;
// הסר אנשי קשר
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: הסר איש קשר באמצעות המתודה .erase()
}
// הדפס את ספר הטלפונים המעודכן
cout << "Updated Contact Directory:" << endl;
// TODO: הדפס את אנשי הקשר שנותרו, או "Directory is empty" אם אין כאלה
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים4מפות (זוגות מפתח-ערך)
היכרות עם std::mapיצירת מפהגישה לערכים ושינויםבדיקה אם מפתחות קיימיםהסרת זוגותמעבר על מפהסיכום – שכיחות מילים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין