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

الـ Iterators

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 72 من 104.

المكررات هي كائنات تعمل كجسر بين الحاويات والخوارزميات. وهي توفر طريقة موحّدة للوصول إلى elements في أي حاوية، بغضّ النظر عن كيفية تخزين تلك الحاوية لـ data داخليًا. فكّر في iterator على أنه مؤشر عام يعرف كيفية التحرك داخل حاوية.

توفّر كل حاوية في STL طريقتَي begin() وend(). يشير مكرّر begin() إلى العنصر الأول، بينما يشير end() إلى الموضع الذي يلي العنصر الأخير - وهو قيمة حارسة تحدد مكان التوقف:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // إلغاء المرجع للحصول على القيمة
    }
    // المخرجات: 10 20 30
}

تُبسّط الكلمة المفتاحية auto تعريفات المكرّرات بشكل كبير:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // تعديل العناصر من خلال المُكرِّر
}
// nums أصبح الآن {20, 40, 60}

تأتي iterators في فئات مختلفة بناءً على إمكاناتها. تدعم المكررات ذات الوصول العشوائي (مثل تلك الموجودة في vector) العمليات الحسابية مثل it + 3 أو it1 - it2.

المكررات ثنائية الاتجاه (من list وmap) يمكنها التحرك إلى الأمام والخلف باستخدام ++ و--. يمكن لـ Forward iterators التحرك في اتجاه واحد فقط.

للاجتياز العكسي، استخدم rbegin() وrend():

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // يطبع بالترتيب العكسي
}
challenge icon

التحدي

سهل

لنَبْنِ نظامًا لتتبّع المخزون يستخدم المؤشرات للتنقّل عبر مجموعات من العناصر ومعالجتها. ستتدرّب على استخدام أنواع مختلفة من المؤشرات للتنقّل عبر البيانات بطرق متنوعة.

ستُنظّم التعليمات البرمجية في ملفين:

  • Inventory.h: عرّف فئة Inventory تدير مجموعة من كميات العناصر المخزّنة في std::vector<int>.

    يجب أن توفّر فئتك الطرق التالية:

    • addItem(int quantity): تضيف كمية عنصر إلى المخزون
    • printForward(): تستخدم المؤشرات مع begin() وend() لطباعة جميع الكميات مفصولة بمسافات، متبوعة بسطر جديد
    • printReverse(): تستخدم المؤشرات العكسية مع rbegin() وrend() لطباعة جميع الكميات بترتيب عكسي، مفصولة بمسافات، متبوعة بسطر جديد
    • doubleAll(): تستخدم المؤشرات للتنقّل عبر المتجه ومضاعفة كل كمية في موضعها
    • getTotal(): تستخدم المؤشرات لحساب مجموع جميع الكميات وإرجاعه

    استخدم الكلمة المفتاحية auto عند تعريف المؤشرات للحفاظ على نظافة التعليمات البرمجية.

  • main.cpp: اقرأ أربعة مُدخلات صحيحة، كلٌّ منها في سطر منفصل، تمثّل كميات العناصر.

    أنشئ كائنًا من Inventory وأضف الكميات الأربع كلها. ثم اعرض استخدام المؤشرات من خلال:

    1. طباعة Forward: متبوعة باستدعاء printForward()
    2. طباعة Reverse: متبوعة باستدعاء printReverse()
    3. طباعة Total: <sum> باستخدام getTotal()
    4. استدعاء doubleAll() لتعديل الكميات
    5. طباعة After doubling: متبوعة باستدعاء printForward()
    6. طباعة New total: <sum> باستخدام getTotal()

على سبيل المثال، عند استخدام المُدخلات 10 و25 و15 و30:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

يتيح لك هذا التحدي التدرّب على قراءة العناصر من خلال المؤشرات (للطباعة والجمع) وتعديل العناصر من خلال المؤشرات (للمضاعفة). وسترى أيضًا كيف تجعل المؤشرات العكسية التنقّل إلى الخلف أمرًا مباشرًا دون الحاجة إلى أي معالجة للفهرس.

جرّب بنفسك

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // اقرأ أربعة مدخلات صحيحة
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: أنشئ كائن Inventory

    // TODO: أضف الكميات الأربع جميعها إلى المخزون

    // TODO: اطبع "Forward: " ثم استدعِ printForward()

    // TODO: اطبع "Reverse: " ثم استدعِ printReverse()

    // TODO: اطبع "Total: " متبوعًا بنتيجة getTotal()

    // TODO: استدعِ doubleAll() لتعديل الكميات

    // TODO: Print "After doubling: " then call printForward()

    // TODO: اطبع "New total: " متبوعًا بنتيجة getTotal()

    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

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