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

std::accumulate

التجميع والاختزال std::accumulate

std::accumulate تختزل نطاقًا كاملًا لقيمة واحدة عبر دمج تراكمي — الاستخدام الافتراضي جمع كل العناصر، لكنها تقبل أي عملية دمج مخصّصة.

تبدأ std::accumulate بقيمة ابتدائية، ثم تمرّ على كل عنصر بالنطاق وتدمجه مع النتيجة المتراكمة حتى الآن — افتراضيًا بعامل +. يمكن استبدال عملية الدمج بلامدا مخصّصة لأي منطق آخر: الضرب التراكمي، دمج نصوص، أو حتى إيجاد أكبر قيمة. موجودة بملف <numeric> وليس <algorithm>.

الصياغة

Type result = std::accumulate(begin, end, initialValue);
std::accumulate(begin, end, initialValue, binaryOp);

📄 مثال

#include <numeric>
#include <vector>

std::vector<int> nums = {1, 2, 3, 4, 5};

int sum = std::accumulate(nums.begin(), nums.end(), 0);
std::cout << sum; // 15

int product = std::accumulate(nums.begin(), nums.end(), 1,
    [](int acc, int n) { return acc * n; });
std::cout << product; // 120

أهم النقاط

العنصرالوظيفة
القيمة الابتدائيةنقطة البداية للتراكم — 0 للجمع، 1 للضرب، وهكذا حسب العملية
العملية الافتراضية (+)بدون معامل رابع، تجمع كل عناصر النطاق ببساطة
binaryOp مخصّصلامدا تأخذ (المتراكم الحالي، العنصر التالي) وتُرجع القيمة المتراكمة الجديدة

💡 نصائح عملية

  • انتبه لنوع القيمة الابتدائية: accumulate(v.begin(), v.end(), 0) بقيم double يقصّها لأعداد صحيحة — استخدم 0.0 بدل 0
  • استخدمها لأي عملية اختزال تحويل نطاق كامل لقيمة واحدة: مجموع، حاصل ضرب، أو حتى دمج نصوص

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

  • استخدام قيمة ابتدائية بنوع خاطئ (int 0 مع عناصر double) — يسبب فقدان الجزء العشري صامتًا بكل خطوة تراكم
  • نسيان include <numeric> والاعتماد فقط على <algorithm> — accumulate بملف منفصل

خصائص ذات صلة

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