C++ Vector Clear vs Erase

C Vector Clear Vs Erase



يحتوي ناقل C++ على العديد من وظائف الأعضاء. اثنان منهم مسح () ومسح (). واضح() 'يزيل' جميع عناصر المتجه. المسح () 'يزيل' عنصرًا واحدًا أو مجموعة من العناصر. هناك نوعان مختلفان من وظيفة العضو draw() للمتجه.

عنوان هذه المقالة هو في الواقع 'Vector Clear() Member Function مقابل Vector draw() Member Function، في C++'. هذه مقارنة بين وظائف العضوين. إنه يتعامل مع متى يتم استخدام أي منهما، وكيفية استخدامه، وتحت أي ظروف يتم استخدام أي منهما.







من أجل استخدام ناقل في برنامج C++، يجب أن يبدأ البرنامج بما يلي:



#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

محتوى المقال

ناقل واضح ()

تقوم وظيفة العضو الواضحة () 'بإزالة' جميع عناصر المتجه. بناء الجملة الخاص به هو:



فارغ واضح ( )

يعود فارغا. يوضح البرنامج التالي استخدامه بالتعبير 'vtr.clear();':





#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



ل ( المتجه < شار > :: مكرر هو - هي = vtr. يبدأ ( ) ; هو - هي ! = vtr. نهاية ( ) ; هو - هي ++ )

cout << * هو - هي << '' ;

cout << endl ;



vtr. واضح ( ) ;



ل ( المتجه < شار > :: مكرر هو - هي = vtr. يبدأ ( ) ; هو - هي ! = vtr. نهاية ( ) ; هو - هي ++ )

cout << * هو - هي << '' ;

cout << endl ;



يعود 0 ;

}

الإخراج هو سطر واحد:

بي كيو آر إس تي يو

إذا لم يتم مسح المتجه، لكان الناتج سطرين من نفس التسلسل. لم يتم عرض أي سطر ثانٍ لأنه تم مسح كافة العناصر.



ناقل ثابت وواضح ()

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

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

مقدار ثابت المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



ل ( المتجه < شار > :: const_iterator هو - هي = vtr. يبدأ ( ) ; هو - هي ! = vtr. نهاية ( ) ; هو - هي ++ )

cout << * هو - هي << '' ;

cout << endl ;



vtr. واضح ( ) ;



ل ( المتجه < شار > :: const_iterator هو - هي = vtr. يبدأ ( ) ; هو - هي ! = vtr. نهاية ( ) ; هو - هي ++ )

cout << * هو - هي << '' ;

cout << endl ;



يعود 0 ;

}

إذا تم اختبار البرنامج، فسيتم إصدار رسالة خطأ، ولن يكون هناك أي تجميع. نظرًا لإعلان المتجه ثابتًا، لم تتمكن الدالة Clear() من العمل، مما أدى إلى ظهور رسالة خطأ من المترجم.

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

محو المتجهات

تركيبات الجملة المبسطة لوظيفتي العضو draw() هي:

أ. محو ( س )

و

أ. محو ( q1,q2 )

حيث a هو اسم المتجه.

محو التكرار (موضع const_iterator)

هذا هو بناء الجملة الكامل لـ 'a.erase(q)'. تقوم بإرجاع مكرر يشير إلى العنصر الذي كان خلف العنصر الذي تم محوه مباشرة. الوسيطة q عبارة عن مكرر يشير إلى العنصر المراد محوه. والبرنامج التالي يوضح ذلك:

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



المتجه < شار > :: مكرر iter = vtr. يبدأ ( ) ;

++ iter ; ++ iter ;



المتجه < شار > :: مكرر هو - هي = vtr. محو ( iter ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



cout << * هو - هي << endl ;



يعود 0 ;

}

الإخراج هو:

بي كيو اس تي يو

س

تم حذف 'R'. يشير المُكرِّر الذي تم إرجاعه الآن إلى 'S'، والذي كان بعد 'R' مباشرة. تقوم دالة العضو، begin()، بإرجاع مكرر يشير إلى العنصر الأول من المتجه. في الكود، تمت زيادة هذا المكرر مرتين للإشارة إلى 'R'. تم مسح 'R' بالتعبير 'vtr.erase(iter)'.

النطاق في المتجهات

بالنسبة للقائمة،

'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في'

التسلسل 'Q'، 'R'، 'S'، 'T' هو نطاق. ومع ذلك، مع حاويات C++، لا يعتبر العنصر الأخير 'T' جزءًا من النطاق. ويشار إلى ذلك بعبارات عامة على النحو التالي:

[ اي جاي )

أو

[ q1, q2 )

'[' في هذه الحالة، يعني أن العنصر الأول في التسلسل مضمن، و')' يعني أن العنصر الأخير غير مدرج.

مسح المكرر (const_iterator أولاً، const_iterator أخيرًا)

هذا هو بناء الجملة الكامل لـ 'a.erase(q1,q2)'. تقوم بإرجاع مكرر يشير إلى العنصر الذي كان يقع خلف النطاق الذي تم مسحه مباشرةً. ملاحظة: لا يتم مسح العنصر الأخير في النطاق. لذلك، سيشير المكرر الذي تم إرجاعه إلى العنصر الأخير في النطاق. الوسيطات q1 و q2 عبارة عن تكرارات تشير إلى العنصرين الأول والأخير في النطاق. والبرنامج التالي يوضح ذلك:

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



المتجه < شار > :: مكرر itB = vtr. يبدأ ( ) ;

++ itB ;

المتجه < شار > :: مكرر itE = vtr. نهاية ( ) ;

-- itE ; -- itE ;



المتجه < شار > :: مكرر هو - هي = vtr. محو ( إي تي بي، إي إي ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



cout << * هو - هي << endl ;



يعود 0 ;

}

الإخراج هو:

بي تي يو

ت

تم حذف 'Q'، 'R'، 'S'. يشير المُكرِّر الذي تم إرجاعه الآن إلى 'T'، وهو العنصر الأخير في نطاق الحاوية. تقوم دالة العضو، end()، بإرجاع مكرر يشير مباشرة بعد العنصر الأخير من المتجه. في الكود، تم تقليل هذا المكرر مرتين للإشارة إلى 'T'، العنصر الأخير في النطاق. تم حذف 'Q' و'R' و'S' بدون العنصر الأخير، 'T' في النطاق، مع التعبير، 'vtr.erase(itB, itE)'.

ناقل ثابت ومسح ()

إذا كان الإعلان عن المتجه مسبوقًا بـ const، بالنسبة للثابت، فلا يمكن مسح أي من عناصره. لن يتم تجميع البرنامج التالي، مما يؤدي إلى ظهور رسالة خطأ للتعبير a.erase(q):

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

مقدار ثابت المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



المتجه < شار > :: const_iterator iter = vtr. يبدأ ( ) ;

++ iter ; ++ iter ;



المتجه < شار > :: const_iterator هو - هي = vtr. محو ( iter ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



cout << * هو - هي << endl ;



يعود 0 ;

}

ولو جرب القارئ البرنامج لتلقى رسالة خطأ. لن يتم تجميع البرنامج.

لن يتم تجميع البرنامج التالي، مما يؤدي إلى ظهور رسالة خطأ للتعبير a.erase(q1,q2):

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

مقدار ثابت المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



المتجه < شار > :: const_iterator itB = vtr. يبدأ ( ) ;

++ itB ;

المتجه < شار > :: const_iterator itE = vtr. نهاية ( ) ;

-- itE ; -- itE ;



المتجه < شار > :: const_iterator هو - هي = vtr. محو ( إي تي بي، إي إي ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



cout << * هو - هي << endl ;



يعود 0 ;

}

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

عودة البوب()

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

فارغ عودة البوب ( )

لا يتطلب أي حجة ويعود فارغًا. والبرنامج التالي يوضح استخدامه:

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



vtr. عودة البوب ( ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



يعود 0 ;

}

الإخراج هو:

ف ق ر س ت

تمت إزالة (محو) العنصر الأخير، 'U'.

تدمير ناقل

هل يمكن تدمير ناقل؟ - نعم! ومع ذلك، عندما يتم تدمير المتجه، يتم مسح جميع عناصره باستثناء اسمه؛ مما يعني أنه لا يزال من الممكن إعادة استخدام إعلان المتجه، ولكن مع بعض عدم اليقين. بناء جملة تدمير المتجه هو:

أ.~عاشراً ( )

حيث 'a' هو اسم المتجه. والبرنامج التالي يوضح ذلك:

#تشمل <ناقل>

#تشمل

استخدام مساحة الاسم الأمراض المنقولة جنسيا ;



كثافة العمليات رئيسي ( )

{

المتجه < شار > vtr = { 'ف' , 'س' , 'ص' , 'س' , 'تي' , 'في' } ;



vtr.~vector ( ) ;



vtr = { 'في' , 'في' , 'X' , 'و' , 'مع' } ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;



vtr.~vector ( ) ;



vtr. إدفع إلى الخلف ( 'أ' ) ;

vtr. إدفع إلى الخلف ( 'ب' ) ;

vtr. إدفع إلى الخلف ( 'ج' ) ;

vtr. إدفع إلى الخلف ( 'د' ) ;

vtr. إدفع إلى الخلف ( 'و' ) ;



ل ( كثافة العمليات أنا = 0 ; أنا < vtr. مقاس ( ) ; أنا ++ ) {

cout << vtr [ أنا ] << '' ;

}

cout << endl ;

يعود 0 ;

}

الإخراج هو:

VWXYZ
ص ^ ر ه @ أ ج د ه

من كمبيوتر المؤلف، مع بعض الأحرف غير الموثوقة في السطر الثاني.

خاتمة

يمكن مقارنة وظيفة العضو المتجه Clear() بوظيفة العضو المتجه محو(). إنهم ليسوا بدائل. Clear () يحذف جميع عناصر المتجه. في الواقع، فهو يخصص كافة العناصر على أنها محذوفة، بحيث يمكن لمواقع الذاكرة الخاصة بها أن تشغلها رموز أخرى. إذا لم يتم تناول موقع الذاكرة لأي عنصر بواسطة كود آخر، فلا يزال من الممكن إعادة استخدام العنصر نيابة عن نفس المتجه. مسح () يحذف عنصرًا أو مجموعة من العناصر. في الواقع، فهو يخصص عنصرًا على أنه محذوف، بحيث يمكن شغل موقع الذاكرة بواسطة رمز آخر. إذا لم يتم تناول موقع الذاكرة لأي عنصر محذوف بواسطة كود آخر، فلا يزال من الممكن إعادة استخدام العنصر نيابة عن نفس المتجه. واضح لديه تشابه للتدمير، ~X().