"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تكرار ناقل بكفاءة في C++ بدون حلقات؟

كيفية تكرار ناقل بكفاءة في C++ بدون حلقات؟

تم النشر بتاريخ 2024-12-22
تصفح:815

How to Efficiently Duplicate a Vector in C   Without Loops?

إنشاء نسخة متجهة

عند إلحاق ناقل لنفسه، فمن المستحسن تجنب استخدام الحلقات لأسباب تتعلق بالأداء. الدالة std::vector::insert، على الرغم من كونها خيارًا، لا تسمح باستخدام مكرر لـ *this.

التعامل مع المشكلة باستخدام std::copy

استخدام std::copy لحل هذه المشكلة قد يبدو كحل، ولكن هذا الأسلوب يمكن أن يؤدي إلى أخطاء التجزئة.

الحل الأمثل الحل

يتضمن الحل الأمثل استخدام كل من تغيير الحجم (أو الاحتياطي) وcopy_n. وإليك كيفية العمل:

auto old_count = xx.size();
xx.resize(2 * old_count);
std::copy_n(xx.begin(), old_count, xx.begin()   old_count);

يخزن هذا الرمز أولاً حجم المتجه الأصلي في old_count. ثم يقوم بتغيير حجم xx لمضاعفة سعته. أخيرًا، std::copy_n ينسخ العناصر من بداية xx إلى نهاية xx، مما يؤدي إلى تكرار المتجه بشكل فعال.

بدلاً من ذلك، يمكنك استخدام الحجز بدلاً من تغيير الحجم:

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));

عند استخدام الاحتياطي، يعد Copy_n ضروريًا نظرًا لأن مكرر end() يشير إلى ما بعد النهاية، مما يجعله غير صالح لـ الإدراج.

يفي هذا النهج بالشروط الموضحة في 23.3.6.5 [vector.modifiers]، مما يضمن أن التكرارات والمراجع قبل أن تظل نقطة الإدراج صالحة، ولا تحدث أي إعادة تخصيص إن أمكن.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3