كيفية تقليص الأمراض المنقولة جنسيا :: ناقلات الأمراض؟
سؤال
هل هناك طريقة لتغيير حجم std::vector
إلى انخفاض القدرات عندما لم تعد بحاجة المساحة المحجوزة من قبل؟
المحلول
وSTL الفعال، من خلال سكوت مايرز، البند 17: استخدام الخدعة swap
لخفض الطاقة الفائضة
vector<Person>(persons).swap(persons);
وبعد ذلك، persons
هو "تقلصت لتناسب".
وهذا يعتمد على حقيقة أن نسخة منشئ vector
ويخصص فقط بقدر الذاكرة عند الحاجة للعناصر التي يتم نسخها.
نصائح أخرى
إذا كنت تستخدم C ++ 11، يمكنك استخدام vec.shrink_to_fit()
. في VS2010 على الأقل، أن لا حيلة مبادلة بالنسبة لك.
وإنشاء الجديد، مؤقت، متجه من واحد موجود ثم استدعاء الأسلوب المبادلة على واحد القائمة، ويمر واحد مؤقت في. دع المؤقتة (الآن مع القديم، المتضخم، عازلة) الخروج من النطاق.
ويا المعزوفة، ناقلات بك وبالضبط الحجم الصحيح لمحتوياته.
وإذا كان هذا يبدو مثل الكثير من النسخ والتوزيع - نضع في اعتبارنا أن هذا هو ما يفعله ناقلات في كل مرة أن realloc الماضي الحد المحجوزة الحالي على أي حال
[عدل] نعم، قلت للتو نفس سيباستيان في أكثر من الكلمات. حالة أخرى من ستاكوفيرفلوو سباق شرط؛ -)
والحيلة تبادل هو وسيلة فعالة للحد من قدرة كائن، انها مقايضة محتوى ناقلات لي مع واحد تم إنشاؤه حديثا بناء نسخة:
vector<Person>(persons).swap(persons);
لاحظ أن ليس هناك ما يضمن أن persons.capacity ()؛ بعد خدعة تبادل يساوي حجم: قدرة ناقلات (الأشخاص) هو القدرة على التنفيذ مكتبة الاحتياطيات لناقلات حجم persons.size ().
وC ++ 11 قدم shrink_to_fit () .
وshrink_to_fit ()، وكذلك الحيلة مقايضة لا يضمن حجم القدرات بشكل فعال خفضت إلى حجم ناقلات.
وعلى أي حال shrink_to_fit () يمكن إبطال المكررات الخاص بك (إذا حدث إعادة توزيع) أو لا يمكن: ان ذلك يعتمد على التنفيذ الفعلي للمكتبة.
ونضع في اعتبارنا أن الحيلة تبادل يتطلب persons.size () نسخة المنشآت لشخص و person.size () التدمير. وshrink_to_fit () يمكن تجنب كل هذا النسخ ويمكن ترك المكررات بك صالحة. استطاع. ولكن من وقت لآخر يحدث أن shrink_to_fit () ينفذ في حيث خدعة تبادل ...