Mergesort - std :: bad_alloc ألقاه عند محاولة تعيين المتجه
سؤال
مساء الخير أيها السيدات والسادة. لذلك ، ليس يومي للأخطاء. تنفيذ Mergesort (وليس في مكان) في C ++ ، وأنا أواجه مشكلة حقيقية مع الكود ، دون أي فكرة عن السبب. الخط الثاني إلى الأخير من mergeSort()
تخصيص الدالة نتيجة merge()
إلى متجه ints ، result
. هذا الخط (التخصيص الفعلي ، وليس الوظيفة) يلقي أ bad_alloc
خطأ ، وليس لدي أي فكرة عن السبب.
يقترح الإنترنت ذلك bad_alloc
يتم إلقاؤه في الغالب بسبب أخطاء خارج الذاكرة ، ولكن لا يمكن أن يكون هذا هو الحال في المرة الأولى التي تسمىها على ناقل 500 Ints ، والتي يجب ألا تكون في أي مكان بالقرب من الذاكرة (ما هذا ، مثل 2 كيلو بايت على أ 32 بت int؟). أفترض أنني أفعل شيئًا سخيفًا وغير صحيح لـ C ++ ، لكنني لا أعرف ماذا. حاولت الاتصال what()
باستثناء ، ولكن هذا يعيد اسمه فقط. الرمز:
vector<int> Sorting::mergeSort(vector<int> A) {
// If the length of A is 0 or 1, it is sorted.
if(A.size() < 2) return A;
// Find the mid-point of the list.
int midpoint = A.size() / 2;
// Declare the left/right vectors.
vector<int> left, right;
// Declare the return vector.
vector<int> result (A.size());
for(int i = 0; i < midpoint; ++i) {
left.push_back(A.at(i));
}
for(int i = midpoint; i < A.size(); ++i) {
right.push_back(A.at(i));
}
left = mergeSort(left);
right = mergeSort(right);
result = merge(left, right);
return result;
}
vector<int> merge(vector<int> left, vector<int> right) {
vector<int> result;
while(left.size() > 0 && right.size() > 0) {
if(left.front() <= right.front()) {
result.push_back(left.front());
left.erase(left.begin());
} else {
result.push_back(right.front());
right.erase(right.begin());
}
}
if(left.size() > 0) {
for(int i = 0; i < left.size(); ++i) {
result.push_back(left.at(i));
}
} else {
for(int i = 0; i < right.size(); ++i) {
result.push_back(right.at(i));
}
}
}
إذا قمت بإعادة كتابة merge
الوظيفة لاتخاذ مجرد إشارة إلى result
وتعديله أثناء الوظيفة ، فهو يعمل بشكل جيد ، لكنني أردت الحفاظ على الكود أقرب ما يمكن إلى رمز psuedo "القياسي" المعطى لدمج Sort.
أنا أقدر أي مساعدة ، شكرا.
المحلول
في ال Merge
وظيفة، vector<int> result
لا يتم إرجاعها.