vector مقابل std::array ومصفوفة C
قارن بين الحاويات التسلسلية الثلاث، واختر إحداها بناءً على الحجم والملكية والأداء.
vector مقابل std::array ومصفوفة C درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ثلاث حاويات متسلسلة
يوفّر C++ ثلاث طرق لحفظ تسلسل متجاور:
- std::vector — حجم ديناميكي وتخزين في الكومة
- std::array — حجم ثابت وقت الترجمة وتخزين في المكدس
- مصفوفة بأسلوب C — حجم ثابت ومستوى منخفض
مصفوفات بأسلوب C
أقدم صيغة للمصفوفات. يكون الحجم جزءًا من النوع. وتتحول تلقائيًا إلى مؤشر عند تمريرها إلى الدوال، فيُفقد حجمها.
int a[5] = {1, 2, 3, 4, 5};
std::cout << a[2]; // 3مشكلات المصفوفات بأسلوب C
تفقد حجمها في معظم السياقات، ولا تتحقق من الحدود، ومن السهل إساءة استخدامها. يُفضّل استخدام std::array أو std::vector في الشيفرة الجديدة.
std::array (C++11)
غلاف رقيق حول مصفوفة ثابتة الحجم. تتمتع بالأداء نفسه الذي تتمتع به مصفوفة C، لكنها تملك نوعًا حقيقيًا ودوال أعضاء مناسبة.
#include <array>
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::cout << a.size(); // 5
std::cout << a.at(2); // bounds-checkedيبقى std::array في المكدس
بخلاف vector، يخزّن std::array عناصره مباشرةً. ولا يتطلب تخصيصًا من الكومة. ويكون الحجم معلمة قالب.
استخدام std::vector للحجم الديناميكي
استخدم std::vector عندما لا تعرف الحجم وقت الترجمة أو عندما سيتغير الحجم وقت التشغيل.
مقارنة الأداء
بالنسبة إلى الأحجام الثابتة، يكون أداء الأنواع الثلاثة متشابهًا. يضيف std::vector تكلفة إضافية صغيرة لتتبع المؤشر والحجم، بالإضافة إلى مستوى واحد من عدم المباشرة.
التمرير إلى الدوال
مرّر vector أو std::array بمرجع const لتجنب النسخ. وينبغي استبدال مصفوفات بأسلوب C بـ std::span (C++20) عند استعارة البيانات.
void process(const std::vector<int>& v);
void process(const std::array<int, 5>& a);
#include <span>
void process(std::span<const int> data); // accepts bothstd::span (C++20)
منظور غير مالك فوق تسلسل متجاور. يشبه زوجًا مكوّنًا من مؤشر وطول. ويقبل المتجهات وstd::arrays ومصفوفات C بطريقة موحّدة.
متى تختار كل نوع
شجرة القرار:
- الحاجة إلى حجم ديناميكي →
std::vector - حجم ثابت دون تخصيص →
std::array - استعارة دون امتلاك →
std::span - التكامل مع شيفرة C → مصفوفة بأسلوب C
التحويل بينها
يمكنك نسخ العناصر بين الأنواع باستخدام النطاقات أو الخوارزميات.
std::array<int, 3> a = {1, 2, 3};
std::vector<int> v(a.begin(), a.end());
int c[3];
std::copy(a.begin(), a.end(), c);اختبار سريع
أي حاوية تخزّن العناصر في المكدس ويكون حجمها معلومًا وقت الترجمة؟
مراجعة
يُفضّل استخدام std::vector للحجم الديناميكي وstd::array للحجم الثابت. ونادرًا ما تكون المصفوفات بأسلوب C الخيار الأفضل في الشيفرة الحديثة. استخدم std::span لاستعارة تسلسل دون امتلاكه.
الأسئلة الشائعة
هل درس «vector مقابل std::array ومصفوفة C» مجاني؟
نعم — نص درس «vector مقابل std::array ومصفوفة C» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «vector مقابل std::array ومصفوفة C»؟
قارن بين الحاويات التسلسلية الثلاث، واختر إحداها بناءً على الحجم والملكية والأداء. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «vector مقابل std::array ومصفوفة C»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات std::vector: push_back وsize وcapacity
- التكرار على المتجهات: الفهرسة وrange-for والمكرّرات
- تعديل المتجهات: insert وerase وclear
- vector مقابل std::array ومصفوفة C