Vec<T>
المتّجه (القائمة الديناميكية) Vec<T>
Vec<T> قائمة ديناميكية الحجم تُخزَّن عناصرها متجاورة على الكومة، وهي الحاوية الأشهر والأكثر استخدامًا في Rust.
Vec<T> يشبه array لكنه ينمو ويتقلّص وقت التشغيل، خلافًا للمصفوفات ذات الحجم الثابت المعروف وقت الترجمة. كل عناصره من نفس النوع T، ويوفّر توابع غنية للإضافة والحذف والتكرار والبحث.
بما أن Vec يخزّن بياناته على الكومة، تمريره لدالة أخرى يتبع نفس قواعد الملكية والاستعارة: مرّره بمرجع (&Vec<T> أو الأفضل &[T]) لتفادي نقل الملكية دون داعٍ.
الصياغة
let v: Vec<T> = Vec::new(); let v = vec![v1, v2, v3]; v.push(value);
📄 مثال
let mut nums: Vec<i32> = Vec::new();
nums.push(1);
nums.push(2);
let doubled: Vec<i32> = vec![1, 2, 3]
.iter()
.map(|x| x * 2)
.collect();
println!("{:?}", doubled); // [2, 4, 6]أهم النقاط
| العنصر | الوظيفة |
|---|---|
| Vec::new() | متّجه فارغ، النوع يُستنتج أو يُصرَّح لاحقًا |
| vec![...] | ماكرو لإنشاء متّجه مباشرة من قيم |
| .push(v) / .pop() | إضافة عنصر للنهاية / إزالته وإعادته كـ Option |
| .iter() / .into_iter() | تكرار بمرجع للعناصر / تكرار يأخذ ملكيتها |
💡 نصائح عملية
- استخدم &[T] كنوع معامل دالة بدل &Vec<T> — أعم ويقبل أيضًا المصفوفات الثابتة
- احجز سعة مسبقة بـ Vec::with_capacity(n) عند معرفة الحجم التقريبي مسبقًا لتفادي إعادة التخصيص المتكرّرة
⚠️ أخطاء شائعة
- محاولة الوصول لفهرس خارج الحدود بـ v[i] — يسبّب panic وقت التشغيل بدل خطأ ترجمة
- استخدام into_iter() ظنًّا أنه لا يأخذ ملكية العناصر، بينما iter() هو من يعمل بمراجع فقط
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار RUST الكامل بالعربي.