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