ناقل في C++ مكتبة النماذج القياسية (STL) مع مثال
⚡ ملخص ذكي
ناقل في C++ هي عبارة عن مصفوفة ديناميكية من مكتبة القوالب القياسية تقوم بتغيير حجمها تلقائيًا عند إضافة العناصر أو إزالتها، وتخزين العناصر في ذاكرة متجاورة بحيث يمكن للمبرمجين الوصول إليها واجتيازها باستخدام أدوات التكرار.

ما هو C++ ناقلات؟
A C++ Vector عبارة عن مصفوفة ديناميكية قادرة على تغيير حجم نفسها تلقائيًا. يحدث تغيير الحجم بعد إضافة عنصر أو حذفه من المتجه. تتم معالجة التخزين تلقائيًا بواسطة الحاوية. يتم تخزين عناصر المتجه في مخزن متجاور. هذا يسمح C++ المبرمجون قادرون على الوصول إلى عناصر المتجهات والانتقال إليها باستخدام المتكررات.
تُضاف البيانات الجديدة إلى المتجه عند نهايته، ويستغرق ذلك وقتًا تفاضليًا. أما حذف عنصر من المتجه فيستغرق وقتًا ثابتًا، وذلك لعدم الحاجة إلى تغيير حجم المتجه. بينما يستغرق إضافة أو حذف عنصر من بداية المتجه وقتًا خطيًا.
قبل كتابة التعليمات البرمجية باستخدام المتجهات، من المفيد معرفة متى تكون هي الحاوية المناسبة التي يجب اللجوء إليها.
متى يتم استخدام المتجهات؟
A C++ ينبغي استخدام المتجه في ظل الظروف التالية:
- عند التعامل مع عناصر البيانات التي تتغير باستمرار.
- إذا لم يكن حجم البيانات معروفًا قبل البدء، فلن يتطلب منك المتجه تحديد الحد الأقصى لحجم الحاوية.
كيفية تهيئة المتجهات في C++
بناء جملة المتجهات في C++ هو:
vector <data-type> name (items)
كما هو موضح أعلاه، نبدأ بالكلمة الأساسية المتجه.
- استخدم نوع البيانات هو نوع بيانات العناصر المراد تخزينها في المتجه.
- استخدم الاسم هو اسم المتجه أو عناصر البيانات.
- استخدم العناصر يشير هذا إلى عدد عناصر بيانات المتجه. هذا المعامل اختياري.
بمجرد وجود متجه، توفر لك أدوات التكرار طريقة تشبه المؤشر للتنقل عبر عناصره.
التكرارات
تُستخدم المُكرِّرات للوصول إلى العناصر المُخزَّنة في المتجه. وهي كائن يعمل كمؤشر. فيما يلي المُكرِّرات الشائعة التي يدعمها C++ المتجهات:
- vector::begin(): إنه يعطي مكررًا يشير إلى العنصر الأول من المتجه.
- vector::end(): إنه يعطي مكررًا يشير إلى عنصر الماضي في المتجه.
- المتجهات::cbegin(): إنها تشبه vector::begin()، لكنها لا تملك القدرة على تعديل العناصر.
- ناقل::cend(): هو نفسه vector::end() ولكنه لا يستطيع تعديل عناصر المتجه.
يقوم المثال التالي بتعبئة متجه ثم يمر عبره باستخدام كل من المكررات القابلة للتغيير والثابتة.
مثال 1
#include <iostream> #include <vector> using namespace std; int main() { vector<int> nums; for (int a = 1; a <= 5; a++) nums.push_back(a); cout << "Output from begin and end: "; for (auto a = nums.begin(); a != nums.end(); ++a) cout << *a << " "; cout << "\nOutput from cbegin and cend: "; for (auto a = nums.cbegin(); a != nums.cend(); ++a) cout << *a << " "; return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا. سيسمح لنا بالقراءة من وحدة التحكم والكتابة إليها.
- قم بتضمين ملف رأس المتجه في الكود الخاص بنا. سيسمح لنا بالعمل مع المتجهات C++.
- قم بتضمين مساحة الاسم std لاستخدام فئاتها ووظائفها دون استدعائها.
- قم باستدعاء الدالة main() التي يجب إضافة منطق البرنامج بداخلها.
- يمثل { بداية نص الوظيفة الرئيسية ().
- قم بتعريف متجه اسمه nums لتخزين مجموعة من الأعداد الصحيحة.
- أنشئ حلقة تكرارية (for loop) لتسهيل المرور على عناصر المتجه. سيساعدنا المتغير في المرور على عناصر المتجه، من العنصر الأول إلى العنصر الخامس.
- ادفع العناصر إلى رقم المتجه من الخلف. لكل تكرار، سيؤدي ذلك إلى إضافة القيمة الحالية للمتغير a إلى المتجه، وهي من 1 إلى 5.
- طباعة بعض النص على وحدة التحكم.
- استخدم متغير التكرار a للتكرار على عناصر الأعداد المتجهة من البداية إلى العنصر الماضي. لاحظ أننا نستخدم مكررات Vector::begin() وvector::end().
- اطبع القيم التي يشير إليها متغير المكرر a على وحدة التحكم لكل تكرار.
- طباعة بعض النص على وحدة التحكم. \n هو حرف سطر جديد، حيث يقوم بتحريك المؤشر إلى السطر الجديد للطباعة من هناك.
- استخدم متغيرًا للتكرار على عناصر المتجه nums من البداية إلى العنصر الذي يلي النهاية. لاحظ أننا نستخدم المكررين vector::cbegin() و vector::cend().
- اطبع القيم التي يشير إليها متغير المكرر a على وحدة التحكم لكل تكرار.
- يجب أن تقوم الوظيفة الرئيسية بإرجاع قيمة إذا تم تشغيل البرنامج بنجاح.
- نهاية نص الدالة main().
الصفات التعريفية
يتم استخدام المعدلات لتغيير معنى نوع البيانات المحدد. فيما يلي المعدلات الشائعة في C++:
- المتجه::push_back(): يقوم هذا المعدل بدفع العناصر من الخلف.
- ناقل::إدراج(): لإدراج عناصر جديدة إلى متجه في موقع محدد.
- المتجهات::pop_back(): يقوم هذا المعدل بإزالة العناصر المتجهة من الخلف.
- ناقل::محو(): يتم استخدامه لإزالة مجموعة من العناصر من الموقع المحدد.
- ناقل::واضح(): فهو يزيل جميع العناصر المتجهة.
يطبق المثال التالي هذه المعدلات بالتسلسل لمعرفة كيف يتغير المتجه.
مثال 2
#include <iostream> #include <vector> using namespace std; int main() { vector<int> nums; nums.assign(5, 1); cout << "Vector contents: "; for (int a = 0; a < nums.size(); a++) cout << nums[a] << " "; nums.push_back(2); int n = nums.size(); cout << "\nLast element: " << nums[n - 1]; nums.pop_back(); cout << "\nVector contents: "; for (int a = 0; a < nums.size(); a++) cout << nums[a] << " "; nums.insert(nums.begin(), 7); cout << "\nFirst element: " << nums[0]; nums.clear(); cout << "\nSize after clear(): " << nums.size(); }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظائفه.
- قم بتضمين ملف رأس المتجه في الكود الخاص بنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل جسمه.
- بداية نص الدالة main().
- قم بتعريف متجه اسمه nums لتخزين بعض قيم الأعداد الصحيحة.
- قم بتخزين 5 عناصر في أرقام المتجهات. كل منها بقيمة 1.
- طباعة بعض النص على وحدة التحكم.
- استخدم متغير التكرار a للتكرار على عناصر أرقام المتجهات.
- اطبع قيم أرقام المتجهات على وحدة التحكم لكل تكرار.
- أضف القيمة 2 إلى نهاية أرقام المتجهات.
- قم بتعريف متغير عدد صحيح n لتخزين حجم أرقام المتجهات.
- اطبع القيمة الأخيرة لأرقام المتجهات بجانب النص الآخر. يجب أن يعود 2.
- قم بإزالة العنصر الأخير من أرقام المتجهات. سيتم إزالة 2.
- طباعة النص على وحدة التحكم. يقوم \n بنقل المؤشر إلى السطر الجديد لطباعة النص هناك.
- استخدم متغير التكرار a للتكرار على عناصر أرقام المتجهات.
- اطبع قيم أرقام المتجهات على وحدة التحكم لكل تكرار.
- أدخل القيمة 7 في بداية أرقام المتجهات.
- اطبع القيمة الأولى لأرقام المتجهات بجانب النص الآخر. يجب أن يعود 7.
- احذف جميع العناصر من أرقام المتجهات.
- قم بطباعة حجم رقم المتجه إلى جانب النص الآخر بعد مسح جميع المحتويات. يجب أن يعود 0.
- نهاية نص الدالة main().
السعة
استخدم ما يلي وظائف لتحديد سعة متجه:
- مقاس() – تُعيد هذه الدالة عدد العناصر في المتجه.
- اقصى حجم() – تُرجع هذه الدالة أعلى عدد من العناصر التي يمكن للمتجه تخزينها.
- سعة() – يقوم بإرجاع مقدار مساحة التخزين المخصصة لمتجه.
- تغيير الحجم() – يقوم هذا الإجراء بتغيير حجم الحاوية لتضم n عنصرًا. إذا كان حجم المتجه الحالي أكبر من n، فسيتم حذف العناصر الموجودة في نهاية المتجه. أما إذا كان حجم المتجه الحالي أصغر من n، فسيتم إضافة عناصر إضافية إلى نهاية المتجه.
- فارغ() – تُرجع القيمة "صحيح" إذا كان المتجه فارغًا. وإلا، فإنها تُرجع القيمة "خطأ".
يقوم هذا المثال الأخير بالإبلاغ عن تخزين متجه وتعديله باستخدام وظائف السعة المذكورة أعلاه.
مثال 3
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vector1; for (int x = 1; x <= 10; x++) vector1.push_back(x); cout << "Vector size: " << vector1.size()<< endl; cout << "Vector capacity: " << vector1.capacity() << endl; cout << "Maximum size of vector: " << vector1.max_size()<< endl; vector1.resize(5); cout << "Vector size after resizing: " << vector1.size() << endl; if (vector1.empty() == false) cout << "Vector is not empty"<<endl; else cout << "Vector is empty"<<endl; return 0; }
الإخراج:
فيما يلي لقطة شاشة للكود:
Code التفسير:
- قم بتضمين ملف رأس iostream في الكود الخاص بنا لاستخدام وظيفته.
- قم بتضمين ملف رأس المتجه في الكود الخاص بنا لاستخدام وظائفه.
- قم بتضمين مساحة الاسم std في الكود الخاص بنا لاستخدام فئاتها دون استدعائها.
- استدعاء الدالة الرئيسية (). يجب إضافة منطق البرنامج داخل نص هذه الوظيفة.
- قم بإنشاء متجه باسم Vector1 لتخزين الأعداد الصحيحة.
- استخدم حلقة for لإنشاء متغير x بقيم من 1 إلى 10.
- ادفع قيم المتغير x إلى المتجه.
- قم بطباعة حجم المتجه بجانب النص الآخر على وحدة التحكم.
- قم بطباعة سعة المتجه بجانب النص الآخر على وحدة التحكم.
- قم بطباعة الحد الأقصى لعدد العناصر التي يمكن أن يحتفظ بها المتجه بجانب النص الآخر على وحدة التحكم.
- قم بتغيير حجم المتجه ليحتوي على 5 عناصر فقط.
- اطبع الحجم الجديد للمتجه بجانب النص الآخر.
- تحقق مما إذا كان المتجه ليس فارغًا.
- اطبع النص على وحدة التحكم إذا لم يكن المتجه فارغًا.
- استخدم عبارة else لتوضيح ما يجب فعله إذا كان المتجه فارغًا.
- النص المطلوب طباعته على وحدة التحكم إذا كان المتجه فارغًا.
- يجب أن يقوم البرنامج بإرجاع القيمة عند اكتماله بنجاح.
- نهاية نص الوظيفة الرئيسية ().





