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

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