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