לולאת for מבוססת טווח
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 15 מתוך 56.
בעוד שלולאות for מסורתיות עם אינדקסים מתאימות היטב למעבר על וקטורים, C++ מציעה פתרון אלגנטי יותר: לולאת for מבוססת טווח. התחביר המודרני הזה מבטל את הצורך בניהול ידני של אינדקסים והופך את הקוד לנקי יותר וקל יותר לקריאה.
לולאת for מבוססת טווח מטפלת עבורך באופן אוטומטי בפרטי האיטרציה. במקום לנהל משתנה אינדקס, פשוט מציינים מה רוצים לעשות עם כל איבר:
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (const std::string& name : names) {
std::cout << name << std::endl;
}הלולאה הזאת עושה בדיוק את אותו הדבר כמו הגישה המסורתית המבוססת על אינדקס, אבל בתחביר פשוט הרבה יותר. המשתנה name מקבל באופן אוטומטי את הערך של כל איבר במערך, אחד בכל פעם.
ייתכן שתבחין בסמל & בהצהרת הלולאה: const std::string& name. בהקשר הזה, & לא מציין „כתובת של”, כפי שאולי ראית בעבר. כאן הוא מצהיר על name כעל הפניה (כינוי) ישירות לכל איבר במערך, במקום ליצור עותק שלו. חשוב על כך כמתן שם חדש לאותו פיסת נתונים, בדומה לשימוש במצביע לאיבר, אך בלי צורך לבצע ביטול הפניה אליו בתוך גוף הלולאה.
מילת המפתח const היא אמצעי בטיחות: היא מונעת ממך לשנות בטעות את האיבר באמצעות הכינוי בתוך גוף הלולאה. הכינוי עצמו עדיין מתקדם לכל איבר חדש בכל איטרציה. זהו התוכן שאליו ניגשים באמצעות הכינוי ונשאר קבוע, ולא ההתקדמות של הלולאה.
לולאת for מבוססת טווח לא רק קריאה יותר, אלא גם בטוחה יותר — אין סיכון לשגיאות אינדקס, מכיוון שאינך מנהל אינדקסים ידנית. היא פועלת עם כל מכל שמאפשר איטרציה, ולכן היא כלי רב־תכליתי לעיבוד אוספי נתונים ב-C++.
אתגר
קלצרו תוכנית שמדגימה לולאת for מבוססת טווח על ידי עיבוד אוסף של שמות ערים והצגתם עם מספר התווים בכל שם.
הקלטים הבאים יסופקו:
- מספר שלם
nהמייצג את מספר הערים - לאחר מכן
nמחרוזות המייצגות שמות של ערים
התוכנית שלכם צריכה:
- ליצור
std::vector<std::string>בשםcities - להשתמש ב-
push_back()כדי להוסיף לווקטור כל אחד מ-nשמות הערים - להשתמש בלולאת for מבוססת טווח כדי לעבור על הווקטור
- עבור כל עיר בלולאה, להדפיס את שם העיר ואחריו את אורכו באמצעות המתודה
.length() - לאחר הלולאה, להדפיס את המספר הכולל של הערים שעובדו באמצעות המתודה
.size()של הווקטור
השתמשו בפורמט הפלט המדויק הבא:
City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]על לולאת ה-for מבוססת הטווח להשתמש בתחביר for (const std::string& city : cities) כדי לעבור על כל איבר בווקטור. השתמשו ב-city.length() כדי לקבל את מספר התווים בכל שם עיר.
נסו בעצמכם
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// קראו את מספר הערים
int n;
cin >> n;
// צרו וקטור לאחסון שמות הערים
vector<string> cities;
// קראו את שמות הערים והוסיפו אותם לווקטור
for (int i = 0; i < n; i++) {
string city;
cin >> city;
cities.push_back(city);
}
// TODO: כתבו את הקוד שלכם למטה
// השתמשו בלולאת for מבוססת טווח כדי לעבור על הווקטור cities
// הדפיסו כל עיר ואת אורך שמה בפורמט שצוין
// לאחר הלולאה, הדפיסו את מספר הערים הכולל שעובדו
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין