تخطَّ إلى المحتوى

iterator

المكرِّرات iterator

iterator كائن يشبه المؤشّر يشير لعنصر داخل حاوية STL ويمكن تحريكه للتنقل بينها — الجسر الموحّد بين كل الحاويات وكل الخوارزميات.

بدل أن تكتب خوارزمية sort منفصلة لكل نوع حاوية (vector، list، array)، خوارزميات STL كلها تتعامل مع iterators فقط — وكل حاوية توفّر begin() وend() يُرجعان iterator لأول عنصر وللموضع الوهمي بعد آخر عنصر. هذا التصميم هو سبب نجاح STL: خوارزمية واحدة (std::sort مثلًا) تعمل مع أي حاوية توفّر iterators متوافقة معها، بلا حاجة لإعادة كتابتها لكل نوع.

الصياغة

Container::iterator it = container.begin();
while (it != container.end()) { ...; ++it; }

📄 مثال

std::vector<int> nums = {10, 20, 30};

for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
    std::cout << *it << " "; // إلغاء الإشارة كالمؤشّر تمامًا
}
// أبسط بكثير مع auto:
for (auto it = nums.begin(); it != nums.end(); ++it) { std::cout << *it; }

أهم النقاط

العنصرالوظيفة
begin() / end()iterator لأول عنصر، وiterator لموضع وهمي بعد آخر عنصر (لا تُلغِ إشارته أبدًا)
*itإلغاء الإشارة للحصول على قيمة العنصر الحالي، تمامًا كالمؤشّر
++itالانتقال للعنصر التالي — سرعته تختلف حسب نوع الحاوية (ثابتة بـ vector، متغيرة بـ map)
range-based forfor (auto& x : container) يُستخدم iterators داخليًا بشكل ضمني وأبسط بالكتابة

💡 نصائح عملية

  • استخدم range-based for (for (auto& x : container)) بكل الحالات العادية — أوضح وأقل عرضة للأخطاء من iterators اليدوية
  • استخدم iterators صراحة فقط عند الحاجة الفعلية لموضع العنصر (مثل تمرير نطاق لخوارزمية أو الحذف أثناء المرور)

⚠️ أخطاء شائعة

  • إلغاء إشارة end() مباشرة (*container.end()) — يشير لموضع وهمي بعد آخر عنصر وليس عنصرًا فعليًا، سلوك غير معرَّف
  • استخدام iterator بعد تعديل الحاوية بطريقة تُبطله (مثل push_back على vector قد يُبطل iterators سابقة بسبب إعادة التحجيم)

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.