كيفية تقليص الأمراض المنقولة جنسيا :: ناقلات الأمراض؟

StackOverflow https://stackoverflow.com/questions/253157

  •  05-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لتغيير حجم 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 () ينفذ في حيث خدعة تبادل ...

scroll top