Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ Range-Based For Loop

جزء من قسم المنطق وتدفق التنفيذ في رحلة C++ على Coddy. الدرس 15 من 56.

في حين أن حلقات for التقليدية باستخدام الفهارس تعمل جيدًا للتكرار through عناصر vector، تقدم C++ حلًا أكثر أناقة: حلقة for المعتمدة على range. تعمل هذه الصياغة الحديثة على إلغاء الحاجة إلى الإدارة اليدوية للفهرس، وتجعل الشيفرة أنظف وأسهل في القراءة.

تتولى حلقة for المستندة إلى النطاق تفاصيل التكرار تلقائيًا نيابةً عنك. وبدلًا من إدارة متغير فهرس، ما عليك سوى تحديد ما تريد فعله مع كل عنصر:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

ينفّذ loop هذا الشيء نفسه تمامًا مثل النهج التقليدي القائم على الفهرس، ولكن باستخدام صياغة أبسط بكثير. يأخذ المتغيّر name تلقائيًا قيمة كل عنصر في vector، عنصرًا واحدًا في كل مرة.

قد تلاحظ الرمز & في تعريف loop: const std::string& name. في هذا السياق، لا يعني & «عنوان» كما قد تكون رأيته من قبل. هنا يُعرِّف name باعتباره مرجعًا (اسمًا مستعارًا) يشير مباشرةً إلى كل عنصر في المتجه، بدلًا من إنشاء نسخة منه. فكّر في الأمر على أنه منح اسم جديد لجزء البيانات نفسه، على نحو مشابه لاستخدام مؤشر إلى العنصر، ولكن من دون الحاجة إلى إلغاء الإشارة إليه داخل جسم loop.

الكلمة المفتاحية const هي إجراء أمان: فهي تمنعك من تعديل العنصر عن طريق الاسم المستعار داخل جسم loop عن طريق الخطأ. يظل الاسم المستعار نفسه ينتقل إلى كل عنصر جديد مع كل تكرار. إن المحتوى الذي تصل إليه من خلال الاسم المستعار هو ما يبقى ثابتًا، وليس تقدم loop.

إنّ range-based for loop ليس أكثر قابلية للقراءة فحسب، بل هو أيضًا أكثر أمانًا؛ فلا يوجد خطر حدوث أخطاء في الفهارس، لأنك لا تدير الفهارس يدويًا. وهو يعمل مع أي حاوية تدعم التكرار، مما يجعله أداةً متعددة الاستخدامات لمعالجة مجموعات البيانات في C++.

challenge icon

التحدي

سهل

اكتب برنامجًا يوضّح حلقة for المستندة إلى النطاق من خلال معالجة مجموعة من أسماء city وعرضها مع أعداد characters الخاصة بها.

سيتم توفير المدخلات التالية:

  • عدد صحيح n يمثّل number المدن
  • ثم n من السلاسل النصية التي تمثّل أسماء city

يجب أن يقوم برنامجك بما يلي:

  1. Create std::vector<std::string> باسم cities
  2. استخدم push_back() لإضافة كل اسم من أسماء city وعددها n إلى المتجه
  3. استخدم حلقة for المستندة إلى النطاق للتكرار عبر المتجه
  4. لكل city في الحلقة، اطبع اسم city متبوعًا بطوله باستخدام الطريقة .length()
  5. After الحلقة، اطبع العدد الإجمالي للمدن التي تمت معالجتها باستخدام طريقة .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() للحصول على number من characters في كل اسم city.

جرّب بنفسك

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // اقرأ عدد المدن
    int n;
    cin >> n;
    
    // أنشئ vector لتخزين أسماء المدن
    vector<string> cities;
    
    // اقرأ أسماء المدن وأضفها إلى الـ vector
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: اكتب الكود الخاص بك أدناه
    // استخدم حلقة for قائمة على النطاق للتكرار عبر الـ cities vector
    // اطبع كل مدينة مع طولها باستخدام التنسيق المحدد
    // After the loop, print the total number of cities processed
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم C++ عبر الإنترنت