גישה לערכים ושינוים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 25 מתוך 56.
ברגע שיש לך מפה עם זוגות מפתח-ערך, לעיתים קרובות תצטרך לאחזר או לעדכן את הערכים המאוחסנים בה. אופרטור הסוגריים המרובעים [] מספק דרך נוחה גם לגשת לערכים קיימים וגם לשנות אותם.
כדי לגשת לערך, פשוט משתמשים במפתח שבתוך סוגריים מרובעים:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // מקבל 95אותה תחביר פועל גם לעדכון ערכים קיימים:
scores["Alice"] = 98; // מעדכן את הציון של Alice ל-98הנה התנהגות חשובה שכדאי לזכור: אם משתמשים באופרטור [] עם מפתח שאינו קיים במפה, הוא יוצר באופן אוטומטי איבר חדש עם המפתח הזה ומאתחל אותו בערך ברירת מחדל (0 עבור מספרים שלמים, מחרוזת ריקה עבור מחרוזות וכו׳).
int bobScore = scores["Bob"]; // יוצר את "Bob" עם הערך 0תכונת היצירה האוטומטית הזו הופכת את האופרטור [] לנוח מאוד לקריאה ולכתיבה של נתוני מפה, כי אין צורך לבדוק אם מפתח קיים לפני שמשתמשים בו.
אפשר גם לעבור על כל צמדי המפתח-ערך במפה באמצעות לולאת for המבוססת על טווח. כל איבר במפה הוא צמד, שבו pair.first מכיל את המפתח ו-pair.second מכיל את הערך:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}פעולה זו תדפיס כל צמד מפתח-ערך המאוחסן במפה, צמד אחד בכל שורה.
אתגר
קלצור תוכנית שמנהלת מערכת מלאי של מוצרים באמצעות std::map. התוכנית תעקוב אחר שמות המוצרים וכמויות המלאי הנוכחיות שלהם, ותאפשר לך לגשת לרמות המלאי ולעדכן אותן.
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר המוצרים הראשוניים - לאחר מכן
nזוגות של קלטים:- מחרוזת המייצגת את שם המוצר
- מספר שלם המייצג את כמות המלאי הראשונית
- מחרוזת המייצגת את שם המוצר שיש לעדכן
- מספר שלם המייצג את כמות המלאי החדשה של אותו מוצר
התוכנית שלך צריכה:
- ליצור
std::map<std::string, int>בשםinventory - לקרוא את מספר המוצרים הראשוניים
- עבור כל מוצר, לקרוא את השם ואת כמות המלאי, ואז להוסיף אותם למפה באמצעות תחביר סוגריים מרובעים
- להדפיס את המלאי הראשוני בפורמט המוצג להלן
- לקרוא את שם המוצר ואת הכמות החדשה לעדכון
- להשתמש באופרטור הסוגריים המרובעים כדי לעדכן את כמות המלאי של המוצר שצוין
- להדפיס את המלאי המעודכן כך שיציג את רמת המלאי ששונתה
השתמש בפורמט הפלט המדויק הבא:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...יש להדפיס את המוצרים בסדר שבו הם מופיעים בעת מעבר על המפה (בסדר אלפביתי לפי שם המוצר). השתמש בלולאת for מבוססת טווח כדי לעבור על המפה בשתי הפעמים, וגשת לכל זוג מפתח-ערך באמצעות pair.first עבור שם המוצר ו-pair.second עבור הכמות. אם שם המוצר שיש לעדכן אינו קיים במפה, אופרטור הסוגריים המרובעים ייצור באופן אוטומטי רשומה חדשה עם השם הזה והכמות שצוינה.
נסו בעצמכם
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// קרא את מספר המוצרים ההתחלתיים
int n;
cin >> n;
// צור את מפת המלאי
map<string, int> inventory;
// קרא את המוצרים ההתחלתיים ואת הכמויות שלהם
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: הוסף את המוצר למפת המלאי
}
// TODO: הדפס את המלאי ההתחלתי
// קרא את המוצר שיש לעדכן ואת הכמות החדשה
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: עדכן את כמות המוצר במפה
// TODO: הדפס את המלאי המעודכן
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים4מפות (זוגות מפתח-ערך)
היכרות עם std::mapיצירת מפהגישה לערכים ושינויםבדיקה אם מפתחות קיימיםהסרת זוגותמעבר על מפהסיכום – שכיחות מילים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין