C++ التخصيص الديناميكي للمصفوفات مع مثال
ما هي المصفوفة الديناميكية؟
المصفوفة الديناميكية تشبه إلى حد كبير المصفوفة العادية، لكن حجمها قابل للتعديل أثناء تشغيل البرنامج. تشغل عناصر DynamArray كتلة متجاورة من الذاكرة.
بمجرد إنشاء المصفوفة، لا يمكن تغيير حجمها. ومع ذلك، مجموعة ديناميكية مختلفة. يمكن للمصفوفة الديناميكية توسيع حجمها حتى بعد ملئها.
أثناء إنشاء المصفوفة، يتم تخصيص مقدار محدد مسبقًا من الذاكرة. ليس هذا هو الحال مع المصفوفة الديناميكية، حيث إنها تزيد حجم ذاكرتها بعامل معين عند الحاجة.
العوامل المؤثرة على أداء المصفوفات الديناميكية
يحدد الحجم الأولي للمصفوفة وعامل نموها أداءها. لاحظ النقاط التالية:
- إذا كانت المصفوفة ذات حجم صغير وعامل نمو صغير، فسوف تستمر في إعادة تخصيص الذاكرة في كثير من الأحيان. سيؤدي هذا إلى تقليل أداء المصفوفة.
- إذا كانت المصفوفة كبيرة الحجم وعامل النمو كبير، فسوف يكون بها جزء كبير من الذاكرة غير المستخدمة. ونتيجة لهذا، قد تستغرق عمليات تغيير الحجم وقتًا أطول. وهذا من شأنه أن يقلل من أداء المصفوفة.
الكلمة الرئيسية الجديدة
In C++يمكننا إنشاء مصفوفة ديناميكية باستخدام الكلمة الأساسية new. يتم تحديد عدد العناصر المراد تخصيصها داخل زوج من الأقواس المربعة. يجب أن يسبق اسم النوع هذا. سيتم تخصيص عدد العناصر المطلوب.
بناء الجملة
الكلمة الرئيسية الجديدة تأخذ بناء الجملة التالي:
pointer_variable = new data_type;
مؤشر_المتغير هو اسم متغير المؤشر.
يجب أن يكون نوع البيانات صالحًا C++ نوع البيانات.
تقوم الكلمة الأساسية بعد ذلك بإرجاع مؤشر إلى العنصر الأول. بعد إنشاء المصفوفة الديناميكية، يمكننا حذفها باستخدام الكلمة الأساسية للحذف.
مثال 1:
#include<iostream> using namespace std; int main() { int x, n; cout << "Enter the number of items:" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " items" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You entered: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتضمين ملف رأس iostream في برنامجنا لاستخدامه وظائف.
- قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص الوظيفة.
- قم بتعريف متغيرين صحيحين x و n.
- قم بطباعة بعض النص على وحدة التحكم لمطالبة المستخدم بإدخال قيمة المتغير n.
- قراءة مدخلات المستخدم من لوحة المفاتيح وتخصيصها للمتغير n.
- قم بتعريف مصفوفة تحتوي على إجمالي n من الأعداد الصحيحة وتخصيصها لمتغير المؤشر *arr.
- اطبع رسالة تطالب المستخدم بإدخال عدد n من العناصر.
- استخدم حلقة for لإنشاء متغير حلقة x للتكرار على العناصر التي أدخلها المستخدم.
- قراءة العناصر التي أدخلها المستخدم وتخزينها في المصفوفة.
- نهاية الجسم لحلقة.
- طباعة بعض النص على وحدة التحكم.
- استخدم حلقة for لإنشاء متغير حلقة x للتكرار على عناصر المصفوفة.
- اطبع القيم الموجودة في المصفوفة المسماة arr على وحدة التحكم.
- نهاية جسم الحلقة.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
ملاحظة: في المثال أعلاه، يُسمح للمستخدم بتحديد أي حجم للمصفوفة أثناء وقت التشغيل. وهذا يعني أن حجم المصفوفة يتم تحديده أثناء وقت التشغيل.
تهيئة المصفوفات المخصصة ديناميكيًا
من السهل تهيئة مصفوفة ديناميكية إلى 0.
بناء الجملة:
int *array{ new int[length]{} };
في بناء الجملة أعلاه، يشير الطول إلى عدد العناصر التي سيتم إضافتها إلى المصفوفة. نظرًا لأننا نحتاج إلى تهيئة المصفوفة إلى 0، فيجب ترك هذا فارغًا.
يمكننا تهيئة مصفوفة ديناميكية باستخدام قائمة المُهيئات. لنقم بإنشاء مثال يوضح ذلك.
مثال 2:
#include <iostream> using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << "Array elements: " << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتضمين ملف رأس iostream في برنامجنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص الوظيفة.
- قم بتعريف متغير عدد صحيح يسمى x.
- أعلن عن مصفوفة ديناميكية باسم array باستخدام قائمة مبدئية. ستحتوي المصفوفة على 5 عناصر عددية صحيحة. لاحظ أننا لم نستخدم عامل "=" بين طول المصفوفة وقائمة المبدئ.
- طباعة بعض النص على وحدة التحكم. النهاية هي أ C++ الكلمة الأساسية التي تعني خط النهاية. ينقل المؤشر إلى الجملة التالية.
- استخدم حلقة for للتكرار على عناصر المصفوفة.
- اطبع محتويات المصفوفة المسماة صفيفًا على وحدة التحكم.
- نهاية جسم الحلقة.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
تغيير حجم المصفوفات
يتم تعيين طول المصفوفة الديناميكية أثناء وقت التخصيص.
ومع ذلك، C++ لا يحتوي على آلية مدمجة لتغيير حجم المصفوفة بمجرد تخصيصها.
ومع ذلك، يمكنك التغلب على هذا التحدي من خلال تخصيص مصفوفة جديدة ديناميكيًا، ونسخ العناصر، ثم مسح المصفوفة القديمة.
ملحوظة: هذه التقنية معرضة للأخطاء فحاول تجنبها.
حذف المصفوفات ديناميكيًا
يجب حذف المصفوفة الديناميكية من ذاكرة الكمبيوتر بمجرد تحقيق الغرض منها. يمكن أن تساعدك عبارة الحذف في تحقيق ذلك. يمكن بعد ذلك استخدام مساحة الذاكرة المحررة للاحتفاظ بمجموعة أخرى من البيانات. ومع ذلك، حتى إذا لم تقم بحذف المصفوفة الديناميكية من ذاكرة الكمبيوتر، فسيتم حذفها تلقائيًا بمجرد انتهاء البرنامج.
ملحوظة:
لحذف مصفوفة ديناميكية من ذاكرة الكمبيوتر، يجب عليك استخدام الحذف [] بدلاً من الحذف. يوجه [] وحدة المعالجة المركزية إلى حذف متغيرات متعددة بدلاً من متغير واحد. قد يؤدي استخدام الحذف بدلاً من الحذف[] عند التعامل مع مصفوفة ديناميكية إلى حدوث مشكلات. تتضمن أمثلة هذه المشكلات تسرب الذاكرة وتلف البيانات والتعطل وما إلى ذلك.
مثال 3:
#include<iostream> using namespace std; int main() { int x, n; cout << "How many numbers will you type?" << "\n"; cin >>n; int *arr = new int[n]; cout << "Enter " << n << " numbers" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You typed: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } cout << endl; delete [] arr; return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
شرح الكود:
- قم بتضمين ملف رأس iostream في برنامجنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في برنامجنا لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص الوظيفة.
- قم بتعريف متغيرين x و n من نوع البيانات الصحيح.
- اطبع بعض النصوص على وحدة التحكم. سيطلب النص من المستخدم تحديد عدد الأرقام التي سيدخلها.
- قراءة مدخلات المستخدم من لوحة المفاتيح. سيتم تعيين قيمة الإدخال للمتغير n.
- قم بتعريف متغير المؤشر *arr. سيحتفظ المصفوفة arr ببعض الذاكرة لتخزين إجمالي n من الأعداد الصحيحة.
- اطبع رسالة على وحدة التحكم تطالب المستخدم بإدخال n رقمًا.
- قم بإنشاء حلقة for ومتغير الحلقة x للتكرار على الأرقام التي أدخلها المستخدم.
- قراءة الأرقام المدخلة من قبل المستخدم وتخزينها في المصفوفة arr.
- نهاية جسم الحلقة.
- طباعة بعض النص على وحدة التحكم.
- استخدم حلقة for ومتغير الحلقة x للتكرار على محتويات المصفوفة arr.
- اطبع قيم المصفوفة الموجودة على وحدة التحكم.
- نهاية جسم الحلقة.
- اطبع سطرًا فارغًا على وحدة التحكم.
- قم بتحرير ذاكرة المصفوفة.
- سيقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الدالة main().
الملخص
- المصفوفات العادية لها حجم ثابت. لا يمكنك تعديل حجمها بمجرد الإعلان عنها.
- مع هذه الأنواع من المصفوفات، يتم تحديد حجم الذاكرة أثناء وقت الترجمة.
- المصفوفات الديناميكية مختلفة. يمكن تغيير أحجامها أثناء وقت التشغيل.
- في المصفوفات الديناميكية، يتم تحديد الحجم أثناء وقت التشغيل.
- المصفوفات الديناميكية في C++ يتم الإعلان عنها باستخدام الكلمة الأساسية الجديدة.
- نستخدم الأقواس المربعة لتحديد عدد العناصر التي سيتم تخزينها في المصفوفة الديناميكية.
- بمجرد الانتهاء من المصفوفة، يمكننا تحرير الذاكرة باستخدام عامل الحذف.
- استخدم عامل الحذف مع [] لتحرير ذاكرة جميع عناصر المصفوفة.
- يؤدي الحذف بدون [] إلى تحرير الذاكرة لعنصر واحد فقط.
- لا توجد آلية مدمجة لتغيير الحجم C++ صفائف.
- لتهيئة مصفوفة باستخدام مُهيئ القائمة، لا نستخدم عامل "=".