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

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 الكامل بالعربي.