std::deque
الطابور ثنائي الاتجاه std::deque
std::deque حاوية تسلسلية تدعم إضافة وحذف فعّالين من كلا الطرفين (البداية والنهاية) بتكلفة ثابتة، مع وصول عشوائي بالفهرس متل vector.
deque (double-ended queue) تشبه vector بتوفيرها وصولًا عشوائيًا بـ operator[] بتكلفة ثابتة، لكنها تتفوّق عليها بدعم push_front/pop_front بتكلفة ثابتة أيضًا — وهو ما تفتقر له vector أساسًا (الإضافة بالبداية فيها تكلفتها خطية لأنها تزيح كل العناصر). الثمن: عناصرها غير مضمونة أن تكون متجاورة بالذاكرة بالكامل (تُخزَّن كأجزاء منفصلة داخليًا)، فلا يمكن تمرير مؤشّر بيانات خام لها مثل vector::data().
الصياغة
std::deque<Type> name; name.push_front(value); name.push_back(value); name.pop_front(); name.pop_back();
📄 مثال
#include <deque>
std::deque<int> d = {2, 3, 4};
d.push_front(1); // إضافة بالبداية — تكلفة ثابتة
d.push_back(5); // إضافة بالنهاية — تكلفة ثابتة
for (int x : d) std::cout << x << " "; // 1 2 3 4 5
std::cout << d[2]; // 3 — وصول عشوائي بالفهرس متل vectorأهم النقاط
| العنصر | الوظيفة |
|---|---|
| push_front / pop_front | إضافة وحذف بالبداية بتكلفة ثابتة — الميزة الأساسية على vector |
| push_back / pop_back | إضافة وحذف بالنهاية بتكلفة ثابتة، متل vector تمامًا |
| operator[] | وصول عشوائي بتكلفة ثابتة، متل vector |
💡 نصائح عملية
- اختره بدل vector لما تحتاج فعليًا إضافة/حذف متكرر من البداية (طابور مهام مثلًا)
- لو لا تحتاج push_front إطلاقًا، vector يبقى الخيار الافتراضي الأفضل — عناصره متجاورة بالذاكرة فعليًا فأداء المرور عليه أسرع عادة
⚠️ أخطاء شائعة
- افتراض أن عناصره متجاورة بالذاكرة متل vector تمامًا — غير مضمون، فلا يوجد data() بنفس معنى vector
- استخدامه افتراضيًا بمكان vector دون حاجة فعلية لـ push_front — تكلفة إضافية غير مبرَّرة غالبًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.