std::for_each
التطبيق على كل عنصر std::for_each
std::for_each تطبّق دالة أو لامدا معيّنة على كل عنصر ضمن نطاق، معبّرة عن النية بوضوح أكثر من كتابة حلقة for يدوية.
من الناحية الوظيفية، std::for_each تعادل تمامًا حلقة range-based for عادية، لكنها تُبرز نية «تطبيق عملية على كل عنصر» بشكل صريح كخوارزمية STL، وتتكامل مباشرة مع بقية عائلة خوارزميات <algorithm>. بكود C++ الحديث، range-based for (for (auto& x : container)) غالبًا أوضح وأبسط للحالات العادية، وfor_each يبرز أكثر عند التركيب مع خوارزميات أخرى أو التمرير كمعامل.
الصياغة
std::for_each(begin, end, function);
📄 مثال
#include <algorithm>
#include <vector>
std::vector<int> nums = {1, 2, 3, 4};
std::for_each(nums.begin(), nums.end(), [](int& n) {
n *= 2; // تعديل مباشر عبر مرجع
});
// nums الآن: 2 4 6 8
std::for_each(nums.begin(), nums.end(), [](int n) {
std::cout << n << " ";
});أهم النقاط
| العنصر | الوظيفة |
|---|---|
| std::for_each(begin, end, fn) | يطبّق fn (لامدا أو دالة) على كل عنصر بالترتيب من begin إلى end |
| معامل بالمرجع (int&) | يسمح بتعديل العناصر الأصلية مباشرة داخل الحاوية |
| معامل بالقيمة (int) | يقرأ العناصر فقط دون تعديل الأصل (نسخة محلية داخل اللامدا) |
💡 نصائح عملية
- للحالات البسيطة (طباعة، قراءة فقط)، range-based for عادة أوضح كتابةً من for_each
- استخدم معامل لامدا بالمرجع (Type&) صراحة عندما تنوي تعديل عناصر الحاوية الأصلية داخل for_each
⚠️ أخطاء شائعة
- تمرير لامدا بمعامل بالقيمة (بدون &) وتوقّع أنها تعدّل العناصر الأصلية — التعديل يبقى على نسخة محلية فقط ولا ينعكس على الحاوية
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.