(إعادة) التهيئة متجه لمدة معينة مع القيم الأولية

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأما حجة وظيفة أحصل على vector<double>& vec (متجه الانتاج، وبالتالي عدم CONST) مع طول والقيم غير معروف. أريد أن التهيئة هذا متجه إلى ن مدة محددة مع كل أصفار.

وهذا سيعمل

vec.clear();
vec.resize( n, 0.0 );

وهذا سيعمل أيضا:

vec.resize( n );
vec.assign( n, 0.0 );

هل ثاني أكثر كفاءة (لأنه لا يوجد إلغاء تخصيص الذاكرة / تخصيص تشارك)؟ هل هناك طريقة أكثر فعالية للقيام بذلك؟

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

المحلول

std::vector<double>(n).swap(vec);

وبعد هذا، ويضمن مركزنا أن يكون حجم وقدرة ن، مع كل القيم 0.0.

ولعل طريقة أكثر الاصطلاحية منذ C ++ 11 هي

vec.assign(n, 0.);
vec.shrink_to_fit();

ومع السطر الثاني اختياري. في حالة حيث يبدأ vec قبالة مع أكثر من العناصر n، سواء للاتصال shrink_to_fit هو المفاضلة بين التمسك المزيد من الذاكرة مما هو مطلوب مقابل أداء إعادة توزيع.

نصائح أخرى

std::vector<double>(n).swap(vec);

وهذا له ميزة ضغط الواقع ناقلات أيضا. (في المثال الأول، clear() لا يضمن ضغط ناقلات الخاص بك).

وحسنا دعونا جولة خارج الطرق للقيام بذلك:)

vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));

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

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

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