كيفية استخدام ناقل C ++

How Use C Vector



مقدمة

المصفوفة هي سلسلة من أنواع الكائنات نفسها في مواقع ذاكرة متتالية. لا يمكن للمصفوفة أن تزيد من طول الخام. المتجه مثل المصفوفة ، لكن يمكن زيادته أو تقليله. وبالتالي ، فإن المتجه له عمليات أكثر بكثير من المصفوفة.

يحتوي C ++ على العديد من المكتبات ، وكلها تشكل مكتبة C ++ القياسية. إحدى هذه المكتبات هي مكتبة الحاوية. الحاوية عبارة عن مجموعة من الكائنات ، ويمكن إجراء عمليات معينة على المجموعة. يمكن تجميع حاويات C ++ في مجموعتين: حاويات متسلسلة وحاويات ارتباطية. حاويات التسلسل عبارة عن ناقلات ، وصفيف (ليست نفس المصفوفة التي تمت مناقشتها سابقًا) ، deque ، forward_list ، و list. هذه مجموعات مختلفة (هياكل بيانات تشبه المصفوفة) ، وكل منها يقدم مقايضات مميزة.







يجب أن يعرف أي مبرمج كيفية تحديد ما إذا كان سيستخدم متجهًا أو مصفوفة أو deque أو قائمة إعادة توجيه أو قائمة. عندما يحتاج المبرمج إلى بنية تتطلب عمليات أكثر من تلك المرتبطة بمصفوفة عادية ، لا ينبغي استخدام المصفوفة العادية.



إذا كانت المهمة تتضمن عمليات إدراج وحذف متكررة في منتصف التسلسل ، فيجب استخدام قائمة أو قائمة إعادة توجيه. إذا كانت المهمة تتضمن عمليات إدراج وحذف متكررة في بداية التسلسل أو نهايته ، فيجب استخدام deque. يجب استخدام المتجه عندما لا تكون هذه الأنواع من العمليات مطلوبة.



يوضح لك هذا المقال كيفية استخدام متجه C ++. ستحتاج إلى بعض المعرفة بمؤشرات C ++ والمراجع والمصفوفات لفهم هذه المقالة.





فئة وكائنات

الفئة عبارة عن مجموعة من المتغيرات والوظائف التي تعمل معًا ، حيث لا يتم تعيين قيم للمتغيرات. عندما يتم تعيين القيم إلى المتغيرات ، تصبح الفئة كائنًا. القيم المختلفة المعطاة لنفس الفئة تؤدي إلى كائنات مختلفة ؛ وهذا يعني أن كائنات مختلفة يمكن أن تكون من نفس الفئة ولكن لها قيم مختلفة. يُعرف أيضًا إنشاء كائن من فئة باسم إنشاء الكائن.

يصف مصطلح متجه فئة. كائن تم إنشاؤه من متجه له اسم يختاره المبرمج.



هناك حاجة إلى وظيفة تنتمي إلى فئة لإنشاء مثيل لكائن من الفئة. في C ++ ، هذه الوظيفة لها نفس اسم اسم الفئة. الكائنات المختلفة التي تم إنشاؤها (تم إنشاء مثيل لها) من الفصل لها أسماء مميزة يعطى لكل منها من قبل المبرمج.

إنشاء كائن من فئة يعني بناء الكائن ؛ هذا يعني أيضًا إنشاء مثيل للكائن.

فئة المتجهات

تم تعريف فئة المتجه بالفعل وهي موجودة في المكتبة. لاستخدام فئة المتجه ، يجب على المبرمج تضمين رأس المتجه في الملف بتوجيه المعالجة المسبقة التالي:

#يشمل

بمجرد تضمين الرأس ، يمكن الوصول إلى جميع ميزات المتجه (أعضاء البيانات ووظائف الأعضاء). لاستخدام كائن العد لإخراج البيانات إلى المحطة الطرفية (وحدة التحكم) ، يجب أيضًا تضمين رأس الكائن. لكتابة برنامج بالمتجه ، كحد أدنى ، يجب تضمين الرؤوس التالية:

#يشمل
#يشمل

إنشاء متجه

intفو[10]؛

أعلاه هو إعلان مصفوفة بالاسم foo وعدد العناصر 10. هذه مصفوفة من الأعداد الصحيحة. إعلان المتجه مشابه. بالنسبة للمتجه ، يكون عدد العناصر اختياريًا ، نظرًا لأن طول المتجه يمكن أن يزيد أو ينقص.

في هذه المرحلة من البرنامج ، تم تحديد فئة المتجه بالفعل في المكتبة ، وتم تضمين الرأس. يمكن إنشاء المتجه على النحو التالي:

ساعات::المتجه <int>vtr(8)؛

هنا ، المتجه هو دالة منشئ خاص. نوع البيانات التي سيحتفظ بها المتجه هو int ، بين قوسين زاوية. المصطلح vtr هو الاسم الذي اختاره المبرمج للمتجه. أخيرًا ، 8 ، بين قوسين ، هو العدد المؤقت للأعداد الصحيحة التي سيكون للمتجه.

يشير مصطلح std إلى مساحة الاسم القياسية. يجب أن يتبع هذا المصطلح نقطتان ، في هذا السياق. يمكن لأي شخص كتابة مكتبة فئة المتجهات الخاصة بهم واستخدامها. ومع ذلك ، فإن C ++ لديها بالفعل مكتبة قياسية بأسماء قياسية ، بما في ذلك المتجهات. لاستخدام اسم قياسي ، يجب أن يسبق الاسم القياسي بـ std ::. لتجنب كتابة std :: في كل مرة في البرنامج لاسم قياسي ، يمكن أن يبدأ ملف البرنامج على النحو التالي:

#يشمل
#يشمل
استخدام اسم للمحطة؛

زيادة التحميل على وظيفة

عندما يكون لتوقيعين مختلفين أو أكثر نفس الاسم ، يُقال أن هذا الاسم محمّل بشكل زائد. عندما يتم استدعاء دالة واحدة ، يحدد عدد ونوع الوسيطات الوظيفة التي يتم تنفيذها.

بناء متجه

يعني إنشاء متجه إنشاء مثيل (إنشاء) كائن متجه. تم تحميل وظيفة المُنشئ بشكل زائد على النحو التالي:

اسم المتجه

يؤدي هذا إلى إنشاء متجه بطول صفر وكتابة T. ينشئ البيان التالي متجهًا بطول صفري للنوع float بالاسم vtr:

المتجه<تطفو>vtr؛

اسم المتجه (ن)

يؤدي هذا إلى إنشاء متجه مع عدد n من العناصر من النوع T. بيان لهذا المتجه بأربعة عناصر عائمة كما يلي:

المتجه<تطفو>vtr(4)؛

اسم المتجه (n ، t)

يؤدي هذا إلى إنشاء متجه لعدد n من العناصر تمت تهيئته إلى القيمة t. تُنشئ العبارة التالية متجهًا من 5 عناصر ، حيث يكون لكل عنصر القيمة 3.4:

المتجه<تطفو>vtr(5و 3.4)؛

البناء مع التهيئة

يمكن إنشاء المتجه (إنشاء) وتهيئته في نفس الوقت ، بإحدى الطريقتين التاليتين:

المتجه<تطفو>vtr= {1.1و 2.2و 3.3و 4.4}؛

أو

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛

لاحظ أنه لا توجد أقواس بعد اسم الكائن مباشرة. يجب أن تحتوي الأقواس المستخدمة بعد اسم الكائن مباشرة على قائمة التهيئة ، على النحو التالي:

المتجه<تطفو>vtr({1.1و 2.2و 3.3و 4.4})؛

يمكن إنشاء المتجه وتهيئته لاحقًا باستخدام قائمة التهيئة. في هذه الحالة ، لن يتم استخدام الأقواس:

المتجه<تطفو>vtr؛
vtr= {1.1و 2.2و 3.3و 4.4}؛

المتجه V2 (V1)

هذا هو مُنشئ نسخة. يقوم بإنشاء متجه V2 كنسخة من المتجه V1. يوضح الكود التالي هذا:

المتجه<تطفو>vtr1(5و 3.4)؛
المتجه<تطفو>vtr2(vtr1)؛

تعيين متجه أثناء الإنشاء

أثناء البناء ، يمكن إنشاء متجه فارغ بينما يتم تخصيص متجه آخر له ، على النحو التالي:

المتجه<تطفو>vtr1{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو>vtr2=vtr1؛

العبارة الثانية تعادل:

المتجه<تطفو>vtr2= {1.1و 2.2و 3.3و 4.4}؛

ناقل مستمر

متجه ثابت هو متجه لا يمكن تغيير عناصره. القيم الموجودة في هذا المتجه للقراءة فقط. عند الإنشاء ، يظهر المتجه على النحو التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛

في هذا النوع المتجه ، لا يمكن إضافة أي عنصر أو إزالته. علاوة على ذلك ، لا يمكن تغيير أي قيمة.

البناء باستخدام التكرار

يوفر القالب تمثيلاً عامًا لنوع البيانات. يوفر المكرر تمثيلًا عامًا للمسح عبر قيم الحاوية. بناء الجملة لإنشاء متجه باستخدام مكرر هو كما يلي:

نموذج<فئة InputIterator>
المتجه(InputIterator أولاوInputIterator الماضيومقدار ثابتالمخصص& =المخصص())؛

يؤدي هذا إلى إنشاء متجه للنطاق [أولاً ، أخيرًا) باستخدام المخصص المحدد ، والذي سيتم مناقشته لاحقًا في هذه المقالة.

تدمير ناقل

لتدمير ناقل ، ما عليك سوى السماح له بالخروج عن النطاق والتدمير يتم التعامل معه تلقائيًا.

قدرة المتجه

حجم_نوع السعة () لا استثناء

يتم إرجاع العدد الإجمالي للعناصر التي يمكن للمتجه الاحتفاظ بها دون الحاجة إلى إعادة التخصيص بواسطة وظيفة عضو القدرة. مقطع الكود لهذا هو كما يلي:

المتجه<تطفو>vtr(4)؛
intعلى واحد=vtr.الاهلية()؛
كلفة<<على واحد<< 'ن'؛

الخرج هو 4.

احتياطي (ن)

مساحة الذاكرة ليست متاحة دائمًا مجانًا. يمكن حجز مساحة إضافية مسبقًا. ضع في اعتبارك مقطع الكود التالي:

المتجه<تطفو>vtr(4)؛
vtr.الاحتياطي(6)؛
كلفة<<vtr.الاهلية() << 'ن'؛

الناتج هو 6. لذا ، المساحة الإضافية المحجوزة هي 6 - 4 = 2 عنصر. ترجع الدالة باطل.

الحجم () لا يستثني من ذلك

هذا يعيد عدد العناصر في المتجه. يوضح الكود التالي هذه الوظيفة:

المتجه<تطفو>vtr(4)؛
تطفوس=vtr.بحجم()؛
كلفة<<س<< 'ن'؛

الخرج هو 4.

يتقلص ليساوي الحجم()

بعد إعطاء سعة إضافية للمتجه مع الوظيفة الاحتياطية () ، يمكن ضبط حجم المتجه ليناسب حجمه الأصلي. يوضح الكود التالي هذا:

المتجه<تطفو>vtr(4)؛
vtr.الاحتياطي(6)؛
vtr.يتقلص ليساوي الحجم()؛
intس=vtr.بحجم()؛
كلفة<<س<< 'ن'؛

الناتج هو 4 وليس 6. ترجع الدالة فارغة.

تغيير الحجم (sz) ، تغيير الحجم (sz ، c)

هذا يغير حجم المتجه. إذا كان الحجم الجديد أصغر من الحجم القديم ، فسيتم مسح العناصر الموجودة في النهاية. إذا كان الحجم الجديد أطول ، فستتم إضافة بعض القيمة الافتراضية في النهاية. لإضافة قيمة معينة ، استخدم الدالة resize () مع وسيطتين. يوضح مقطع الكود التالي استخدام هاتين الوظيفتين:

المتجه<تطفو>vtr1{1.1و 2.2و 3.3و 4.4}؛
vtr1.تغيير الحجم(2)؛
كلفة<< 'الحجم الجديد لـ vtr1:' <<vtr1.بحجم() << 'ن'؛
المتجه<تطفو>vtr2{1.1و 2.2}؛
vtr2.تغيير الحجم(4و 8.8)؛
كلفة<< 'vtr2:'<<vtr2[0] <<'<<vtr2[1] <<'
'
<<vtr2[2] <<'<<vtr2[3] << 'ن'؛

الإخراج هو ما يلي:

الحجم الجديد لـ vtr1: 2
vtr2: 1.1 2.2 8.8 8.8

الوظائف ترجع باطلة.

فارغ () const noexcept

ترجع هذه الدالة 1 لصحيح إذا لم يكن هناك عناصر في المتجه و 0 للخطأ إذا كان المتجه فارغًا. إذا كان للمتجه 4 مواقع لنوع معين من البيانات ، مثل عائم ، بدون أي قيمة عائمة ، فإن هذا المتجه ليس فارغًا. يوضح الكود التالي هذا:

المتجه<تطفو>vtr؛
كلفة<<vtr.فارغة() << 'ن'؛
المتجه<تطفو>فاتو(4)؛
كلفة<<لهذا السببفارغة() << 'ن'؛

المتجه<تطفو>الخامس(4و3.5)؛
كلفة<<الخامس.فارغة() << 'ن'؛

الإخراج هو ما يلي:

1
0
0

الوصول إلى عنصر المتجه

يمكن أن يكون المتجه مبرمجًا فرعيًا (مفهرسًا) مثل المصفوفة. يبدأ عد الفهرس من الصفر.

اسم [i]

ترجع العملية vectorName [i] مرجعًا إلى العنصر في iذفهرس المتجه. نواتج الكود التالي 3.3 للمتجه أعلاه:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr[2]؛
كلفة<<فلوريدا<< 'ن'؛

vectorName [i] const

يتم تنفيذ VectorName [i] const بدلاً من vectorName [i] عندما يكون المتجه متجهًا ثابتًا. يتم استخدام هذه العملية في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr[2]؛
كلفة<<فلوريدا<< 'ن'؛

يعيد التعبير مرجعًا ثابتًا إلى iذعنصر المتجه.

تعيين قيمة مع Subscript

يمكن تخصيص قيمة لمتجه غير ثابت ، على النحو التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
vtr[2] = 8.8؛
كلفة<<vtr[2] << 'ن'؛

الخرج هو 8.8.

vectorName.at (i)

vectorName.at (i) يشبه vectorName [i] ، لكن VectorName.at (i) أكثر موثوقية. يوضح الكود التالي كيف يجب استخدام هذا المتجه:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.في(2)؛
كلفة<<فلوريدا<< 'ن'؛
في()هو عضو ناقلوظيفة.

vectorName.at (i) const

VectorName.at (i) const يشبه vectorName [i] const ، لكن vectorName.at (i) const أكثر موثوقية. يتم تنفيذ vectorName.at (i) const بدلاً من vectorName.at (i) عندما يكون المتجه متجهًا ثابتًا. يستخدم هذا المتجه في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.في(2)؛
كلفة<<فلوريدا<< 'ن'؛
في() مقدار ثابتهو عضو ناقلوظيفة.

تعيين قيمة باستخدام الدالة at ()

يمكن تخصيص قيمة لمتجه غير ثابت باستخدام الدالة at () ، على النحو التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
vtr.في(2) = 8.8؛
كلفة<<vtr[2] << 'ن'؛

الخرج هو 8.8.

مشكلة في البرمجة النصية الفرعية

تكمن مشكلة البرمجة الفرعية (الفهرسة) في أنه إذا كان الفهرس خارج النطاق ، فقد يتم إرجاع الصفر أو قد يتم إصدار خطأ في وقت التشغيل.

أمام()

يؤدي هذا إلى إرجاع مرجع للعنصر الأول للمتجه دون إزالة العنصر. ناتج الكود التالي هو 1.1.

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.أمام()؛
كلفة<<فلوريدا<< 'ن'؛

لا يتم إزالة العنصر من المتجه.

الجبهة () const

عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير front () const بدلاً من front (). يستخدم هذا في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.أمام()؛
كلفة<<فلوريدا<< 'ن'؛

يتم إرجاع مرجع ثابت. لا يتم إزالة العنصر من المتجه.

الى الخلف()

يؤدي هذا إلى إرجاع مرجع إلى العنصر الأخير من المتجه دون إزالة العنصر. ناتج الكود التالي هو 4.4.

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.الى الخلف()؛
كلفة<<فلوريدا<< 'ن'؛

رجوع () const

عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير back () const بدلاً من back (). يستخدم هذا في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
تطفوفلوريدا=vtr.الى الخلف()؛
كلفة<<فلوريدا<< 'ن'؛

يتم إرجاع مرجع ثابت. لا يتم إزالة العنصر من المتجه.

الوصول إلى بيانات المتجه

البيانات () لا باستثناء ؛ البيانات () لا يوجد استثناء ؛

يؤدي أي من هذين الخيارين إلى إرجاع مؤشر بحيث تكون [data () ، data () + size ()) نطاقًا صالحًا.

سيتم تغطية هذا بمزيد من التفصيل لاحقًا في المقالة.

إرجاع التكرارات والمتجه

المكرر هو مثل المؤشر ولكن لديه وظائف أكثر من المؤشر.

تبدأ () لا باستثناء

إرجاع مكرر يشير إلى العنصر الأول للمتجه ، كما في مقطع التعليمات البرمجية التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::مكررالتكرار=vtr.يبدأ()؛
كلفة<< *التكرار<< 'ن'؛

الخرج 1.1. لاحظ أنه تم التصريح عن التصريح الذي يتلقى المكرر. يتم إلغاء الإشارة إلى المكرر في تعبير إرجاع للحصول على القيمة بنفس الطريقة التي يتم بها إلغاء الإشارة إلى المؤشر.

تبدأ () const noexcept؛

إرجاع مكرر يشير إلى العنصر الأول للمتجه. عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير start () const بدلاً من start (). في ظل هذا الشرط ، لا يمكن تعديل العنصر المقابل في المتجه. يستخدم هذا في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::المُحددالتكرار=vtr.يبدأ()؛
كلفة<< *التكرار<< 'ن'؛

الخرج 1.1. لاحظ أنه تم استخدام const_iterator هذه المرة بدلاً من مجرد مكرر لتلقي المكرر الذي تم إرجاعه.

النهاية () باستثناء

إرجاع مكرر يشير مباشرة إلى ما بعد العنصر الأخير للمتجه. ضع في اعتبارك مقطع الكود التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::مكررالتكرار=vtr.نهاية()؛
كلفة<< *التكرار<< 'ن'؛

الناتج هو 0 ، وهو لا معنى له ، حيث لا يوجد عنصر ملموس يتجاوز العنصر الأخير.

end () const noexcept

إرجاع مكرر يشير مباشرة إلى ما بعد العنصر الأخير للمتجه. عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير end () const بدلاً من end (). ضع في اعتبارك مقطع الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::المُحددالتكرار=vtr.نهاية()؛
كلفة<< *التكرار<< 'ن'؛

الناتج هو 0. لاحظ أنه تم استخدام const_iterator هذه المرة بدلاً من مجرد مكرر لتلقي مكرر تم إرجاعه.

التكرار العكسي

من الممكن أن يكون لديك مكرر يتكرر من النهاية إلى ما قبل العنصر الأول مباشرة.

rbegin () لا استثناء

إرجاع مكرر يشير إلى العنصر الأخير في المتجه ، كما في مقطع التعليمات البرمجية التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::العكسيrIter=vtr.rbegin()؛
كلفة<< *rIter<< 'ن'؛

الخرج هو 4.4.

لاحظ أنه تم التصريح عن الإعلان الذي يتلقى مكررًا عكسيًا. يتم إلغاء الإشارة إلى المكرر في تعبير إرجاع للحصول على القيمة بنفس الطريقة التي يتم بها إلغاء الإشارة إلى المؤشر.

rbegin () const noexcept ؛

إرجاع مكرر يشير إلى العنصر الأخير في المتجه. عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير rbegin () const بدلاً من rbegin (). في ظل هذا الشرط ، لا يمكن تعديل العنصر المقابل في المتجه. يتم استخدام هذه الميزة في الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::const_reverse_iteratorrIter=vtr.rbegin()؛
كلفة<< *rIter<< 'ن'؛

الخرج هو 4.4.

لاحظ أنه تم استخدام const_reverse_iterator هذه المرة ، بدلاً من العكس فقط ، لتلقي المكرر المرتجع.

عرض () لا استثناء

إرجاع مكرر يشير قبل العنصر الأول للمتجه مباشرة. ضع في اعتبارك مقطع الكود التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::العكسيrIter=vtr.يصنع()؛
كلفة<< *rIter<< 'ن'؛

الناتج هو 0 ، وهو لا معنى له ، حيث لا يوجد عنصر ملموس قبل العنصر الأول مباشرة.

تقديم () const noexcept

إرجاع مكرر يشير قبل العنصر الأول للمتجه مباشرة. عندما يسبق بناء المتجه بـ const ، يتم تنفيذ التعبير rend () const بدلاً من rend (). ضع في اعتبارك مقطع الكود التالي:

مقدار ثابتالمتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو> ::const_reverse_iteratorrIter=vtr.يصنع()؛
كلفة<< *rIter<< 'ن'؛

الناتج هو 0.

لاحظ أنه تم استخدام const_reverse_iterator هذه المرة ، بدلاً من العكس فقط ، لتلقي المكرر المرتجع.

معدِّلات المتجهات

يمكن للمعدِّل الذي يعدل المتجه أن يأخذ مكررًا أو يعيده.

a.emplace (p ، args)

يُدرج كائنًا من النوع T مبنيًا باستخدام std :: forward (args) ... قبل p.

لمزيد من التفاصيل - انظر لاحقًا

أدخل (iteratorPosition، value)

يُدرج نسخة من القيمة عند موضع مكرر المتجه. إرجاع المكرر (الموضع) في المتجه حيث تم وضع النسخة. يوضح الكود التالي مكان وضع القيمة:

المتجه<int>vtr{10و عشرينو 30و 40}؛
المتجه<int> ::مكررالتكرار=vtr.يبدأ()؛
++التكرار؛
++التكرار؛
vtr.إدراج(التكرارو 25)؛
كلفة<<vtr[1] << ' <<vtr[2]<< '
'
<<vtr[3] << 'ن'؛

الخرج هو: 20 25 30.

لاحظ أن المكرر كان متقدمًا (متزايدًا) تمامًا مثل المؤشر.

يمكن أيضًا إدراج قائمة المُهيئ ، كما يوضح الكود التالي:

المتجه<int>vtr{10و عشرينو 30و 40}؛
المتجه<int> ::مكررالتكرار=vtr.يبدأ()؛
++التكرار؛
++التكرار؛
vtr.إدراج(التكرارو {25و 28})؛

كلفة<<vtr[1] << ' <<vtr[2]<< '
'
<<vtr[3]<< ' <<vtr[4] << 'ن'؛

الخرج هو: 20 25 28 30.

محو (موقف)

يزيل عنصرًا في الموضع الذي يشير إليه المكرر ، ثم يعيد موضع المكرر. يوضح الكود التالي هذا:

المتجه<int>vtr{10و عشرينو 30و 40}؛
المتجه<int> ::مكررالتكرار=vtr.يبدأ()؛
++التكرار؛
++التكرار؛
vtr.محو(التكرار)؛
كلفة<<vtr[0] << ' <<vtr[1] << '
'
<<vtr[2]<< 'ن'؛

الخرج هو: 10 20 40

push_back (t) ، push_back (rv)

يستخدم لإضافة عنصر واحد في نهاية المتجه. استخدم push_back (t) كما يلي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
vtr.إدفع إلى الخلف(5.5)؛
تطفوفلوريدا=vtr[4]؛
كلفة<<فلوريدا<< 'ن'؛

الخرج 5.5.

إدفع إلى الخلف(rv): -اراك لاحقا.

عودة البوب()

يزيل العنصر الأخير دون إعادته. يتم تقليل حجم المتجه بمقدار 1. يوضح الكود التالي هذا:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
vtr.عودة البوب()؛
تطفوس=vtr.بحجم()؛
كلفة<<س<< 'ن'؛

الخرج هو 3.

أ. swap (ب)

يمكن تبديل متجهين ، كما هو موضح في مقطع الكود التالي:

المتجه<تطفو>vtr1{1.1و 2.2و 3.3و 4.4}؛
المتجه<تطفو>vtr2{10و عشرين}؛
vtr1.مبادلة، مقايضة(vtr2)؛
كلفة<< 'vtr1:'<<vtr1[0] <<'<<vtr1[1] <<'
'
<<vtr1[2] <<'<<vtr1[3] << 'ن'؛

كلفة<< 'vtr2:'<<vtr2[0] <<'<<vtr2[1] <<'
'
<<vtr2[2] <<'<<vtr2[3] << 'ن'؛

الخرج هو:

vtr1: 10 عشرين 0 0
vtr2: 1.1 2.2 3.3 4.4

لاحظ أنه يتم زيادة طول المتجه ، إذا لزم الأمر. أيضًا ، يتم استبدال القيم التي لا تحتوي على بدائل ببعض القيم الافتراضية.

صافي()

يزيل كل العناصر من المتجه ، كما يوضح مقطع الكود التالي:

المتجه<تطفو>vtr{1.1و 2.2و 3.3و 4.4}؛
vtr.صافي()؛
كلفة<<vtr.بحجم() << 'ن'؛

الناتج هو 0.

عوامل المساواة والعلائقية للمتجهات

عامل التشغيل ==

يتم إرجاع 1 إلى صحيح إذا كان المتجهان لهما نفس الحجم والعناصر المقابلة لها متساوية ؛ وبخلاف ذلك ، تقوم بإرجاع القيمة 0 للقيمة false. على سبيل المثال:

المتجه<int>يو{1و 2و 3}؛
المتجه<int>الخامس{4و 5و 6}؛
منطقية بل=يو==الخامس؛
كلفة<<bl<< 'ن'؛

الناتج هو 0.

عامل التشغيل! =

إرجاع 1 لصحيح إذا لم يكن للمتجهين نفس الحجم و / أو العناصر المقابلة غير متساوية ؛ وبخلاف ذلك ، تقوم بإرجاع القيمة 0 للقيمة false. على سبيل المثال:

المتجه<int>يو{1و 2و 3}؛
المتجه<int>الخامس{4و 5و 6}؛
منطقية بل=يو! =الخامس؛
كلفة<<bl<< 'ن'؛

الخرج هو 1.

ال

تُرجع القيمة 1 لصواب إذا كان المتجه الأول هو المجموعة الفرعية الأولية للمتجه الثاني ، مع كون عناصر الجزأين المتساويين متطابقتين وبنفس الترتيب. إذا كان كلا المتجهين من نفس الحجم ويتحركان من اليسار إلى اليمين وتمت مصادفة عنصر في المتجه الأول أقل من العنصر المقابل في المتجه الثاني ، فسيظل 1 يتم إرجاعه. خلاف ذلك ، يتم إرجاع القيمة 0 للخطأ. على سبيل المثال:

المتجه<int>يو{3و 1و 1}؛
المتجه<int>الخامس{3و 2و 1}؛
منطقية بل=يو<الخامس؛
كلفة<<bl<< 'ن'؛

الخرج هو 1.

> عامل التشغيل

عوائد! (يو

ال<= Operator

إرجاع U<= V, where U is the first vector and V is the second vector, according to the above definitions.

عامل التشغيل> =

عوائد! (يو<= V), where U is the first vector and V is the second vector, according to the above definitions.

استنتاج

المتجه هو مثال على حاوية التسلسل. المتجه هو شكل أفضل من المصفوفة العادية ويتم إنشاء مثيل له من فئة. النواقل لها طرق مصنفة تحت: الإنشاء والتعيين ، السعة ، الوصول إلى العناصر ، الوصول إلى البيانات ، التكرارات ، المعدلات ، المشغلين العدديين المحملين بالحمل الزائد.

هناك حاويات تسلسل أخرى تسمى list و forward_list و array. إذا كانت المهمة تتضمن عمليات إدراج وحذف متكررة في منتصف التسلسل ، فيجب استخدام قائمة أو قائمة إعادة توجيه. إذا كانت المهمة تتضمن عمليات إدراج وحذف متكررة في بداية التسلسل أو نهايته ، فيجب استخدام deque. وبالتالي ، يجب استخدام المتجهات فقط عندما لا تكون هذه الأنواع من العمليات مهمة.