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 for | for (auto& x : container) يُستخدم iterators داخليًا بشكل ضمني وأبسط بالكتابة |
💡 نصائح عملية
- استخدم range-based for (for (auto& x : container)) بكل الحالات العادية — أوضح وأقل عرضة للأخطاء من iterators اليدوية
- استخدم iterators صراحة فقط عند الحاجة الفعلية لموضع العنصر (مثل تمرير نطاق لخوارزمية أو الحذف أثناء المرور)
⚠️ أخطاء شائعة
- إلغاء إشارة end() مباشرة (*container.end()) — يشير لموضع وهمي بعد آخر عنصر وليس عنصرًا فعليًا، سلوك غير معرَّف
- استخدام iterator بعد تعديل الحاوية بطريقة تُبطله (مثل push_back على vector قد يُبطل iterators سابقة بسبب إعادة التحجيم)
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.