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

std::list

القائمة المرتبطة ثنائيًا std::list

std::list قائمة مرتبطة ثنائيًا (doubly linked list) — إدراج وحذف بتكلفة ثابتة بأي موضع طالما تملك مكرِّرًا إليه، لكن بلا وصول عشوائي بالفهرس إطلاقًا.

على عكس vector وdeque، لا تدعم list الوصول العشوائي (لا يوجد operator[])؛ الوصول لعنصر يتطلّب المرور تسلسليًا من البداية أو النهاية. بالمقابل، إدراج أو حذف عنصر بمنتصف القائمة تكلفته ثابتة O(1) طالما تملك مكرِّرًا (iterator) يشير لموضعه بالفعل — بعكس vector حيث الإدراج بالمنتصف يزيح كل ما بعده. مناسبة لحالات إدراج/حذف كثيف بمواضع معروفة مسبقًا، غير مناسبة لو الوصول العشوائي أو المرور المتكرر هو الأشيع.

الصياغة

std::list<Type> name;
name.push_front(value); name.push_back(value);
name.insert(iterator, value); name.erase(iterator);

📄 مثال

#include <list>

std::list<int> l = {1, 2, 4, 5};

auto it = std::find(l.begin(), l.end(), 2);
if (it != l.end()) {
    l.insert(std::next(it), 3); // إدراج 3 بعد 2 — تكلفة ثابتة فور معرفة الموضع
}

for (int x : l) std::cout << x << " "; // 1 2 3 4 5

أهم النقاط

العنصرالوظيفة
insert(it, value)إدراج بتكلفة ثابتة بأي موضع طالما تملك مكرِّرًا إليه
erase(it)حذف بتكلفة ثابتة، لا يزيح باقي العناصر متل vector
بلا operator[]لا وصول عشوائي إطلاقًا — فقط مرور تسلسلي عبر مكرِّرات

💡 نصائح عملية

  • اخترها فقط لو الإدراج/الحذف الكثيف بمواضع معروفة أهم فعليًا من الوصول العشوائي أو المرور المتكرر
  • لمعظم الحالات العملية، vector أسرع فعليًا حتى بالإدراج والحذف المتوسط بسبب تجاور الذاكرة — لا تفترض list أسرع تلقائيًا

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

  • محاولة استخدام operator[] عليها ظنًا أنها تدعمه متل vector — غير موجود إطلاقًا بهذه الحاوية
  • اختيارها افتراضيًا لـ "الإدراج السريع" دون قياس فعلي — تجاور ذاكرة vector غالبًا يجعله أسرع عمليًا رغم تكلفة الإدراج النظرية الأعلى

خصائص ذات صلة

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