لماذا لا يتم تغيير حجم وأعمال واضحة في gotw 54؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

في اشارة الى المادة gotw 54. من قبل Herbsutter، يشرح

  1. الطريق الصحيح إلى "يتقلص إلى تناسب" متجه أو deque و

  2. الطريق الصحيح لإزالة ناقل تماما أو deque

هل يمكننا فقط استخدام container.resize()و container.clear() للمهمة أعلاه أو أنا في عداد المفقودين شيئا؟

هل كانت مفيدة؟

المحلول

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

لذلك على سبيل المثال.

size     == how much you are using
capacity == how much memory is reserved
vector<int> v(10);

v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear()    // size == 0 but capacity (may or may) not be changed

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

نصائح أخرى

لا تغيير حجم () ولا واضح () العمل. ال .capacity() من متجه مضمون ليكون كبيرا على الأقل مثل الحالي size() من المتجه، ومضمان أن تكون على الأقل كبيرة مثل reserve()س قدرة. هذا ايضا .capacity() لا يتقلص، لذلك هو أيضا على الأقل كبيرة مثل أي السابق size() أو reserve()ation.

الآن، .capacity() من متجه هو مجرد الذاكرة المحجوزة. في كثير من الأحيان ليست كل هذه الكائنات cotains الذاكرة. تغيير الحجم يزيل الكائنات، ولكن لا يعيد تدوير الذاكرة. يمكن للمتجه إعادة تدويره فقط عازلة الذاكرة عند تخصيص مخزن مؤقت أكبر.

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

المتجه لديه حجم والقدرة. قد يحتفظ بعناصر x ولكن لديها ذاكرة غير مهيأة في متجر عناصر y أكثر. في محو التنفيذ النموذجي، قم بتغيير حجمه (عند تغيير حجمه إلى الحجم الأصغر) ومسح لا يؤثر على السعة: يحتفظ المتجه بالذاكرة حول نفسه، إذا كنت ترغب في إضافة عناصر جديدة إليها في وقت لاحق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top