std::vector
المصفوفة الديناميكية std::vector
std::vector مصفوفة ديناميكية تكبر تلقائيًا حسب الحاجة، وتُعد الحاوية الافتراضية والأكثر استخدامًا بـ C++ الحديثة.
على عكس المصفوفة التقليدية ذات الحجم الثابت، vector يدير ذاكرته الداخلية تلقائيًا: يبدأ بسعة معيّنة، وعند امتلائها يحجز كتلة ذاكرة أكبر (عادة ضعف الحجم) وينقل العناصر إليها تلقائيًا. الوصول العشوائي للعناصر عبر [] أو at() بسرعة ثابتة O(1) تمامًا كالمصفوفة العادية، والإضافة بالنهاية عبر push_back سريعة جدًا في المتوسط.
يُنصح باستخدام vector كخيار افتراضي أول لأي قائمة عناصر بـ C++، وعدم التفكير بحاوية أخرى (list، deque) إلا لحاجة أداء محدّدة ومثبتة.
الصياغة
std::vector<Type> name; name.push_back(value); name[index];
📄 مثال
#include <vector>
std::vector<int> nums = {10, 20, 30};
nums.push_back(40);
for (int n : nums) {
std::cout << n << " ";
} // 10 20 30 40
std::cout << nums.size(); // 4
std::cout << nums[1]; // 20أهم النقاط
| العنصر | الوظيفة |
|---|---|
| push_back(v) | إضافة عنصر بنهاية المتّجه — سريعة في المتوسط O(1) مطفأة |
| operator[] / at(i) | وصول عشوائي بسرعة ثابتة؛ at() تفحص الحدود وترمي استثناء عند تجاوزها، [] لا تفحص |
| size() / empty() | عدد العناصر الحالي، وفحص سريع إن كان المتّجه فارغًا |
| reserve(n) | تحجز سعة مسبقًا لتفادي إعادة التحجيم المتكررة عند معرفة العدد التقريبي سلفًا |
💡 نصائح عملية
- استخدم reserve() قبل حلقة تضيف عددًا كبيرًا معروفًا من العناصر — يوفّر إعادة تحجيم وحجز ذاكرة متكرر
- فضّل at() على [] أثناء التطوير والتصحيح — ترمي استثناءً واضحًا عند تجاوز الحدود بدل سلوك غير معرَّف
⚠️ أخطاء شائعة
- الوصول بـ [] لفهرس خارج الحدود — سلوك غير معرَّف قد لا يظهر خطأً فوريًا لكنه يفسد الذاكرة
- الاحتفاظ بمؤشّر أو مرجع لعنصر بالمتّجه ثم إضافة عناصر أخرى — إعادة التحجيم قد تُبطل كل المؤشرات القديمة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.