簡體   English   中英

合並排序中的C ++向量中的std :: bad_alloc錯誤

[英]std::bad_alloc error in C++ vector in merge sort

我試圖在c ++中使用向量實現合並排序,我得到以下錯誤 - 在拋出'std :: bad_alloc'的實例后調用terminate。 bad_alloc還有其他解決方案,但沒有幫助。

問題是合並功能 -

#include<iostream>
#include<vector>
using namespace std;

void print(vector<int> v)
{
    for(int i=0; i<v.size(); i++)
        cout << v[i] << " ";
    cout << endl;
}

vector<int> merging(vector<int> left, vector<int> right)
{
    vector<int> result;
    while((int)left.size()>0 && (int)right.size()>0)
    {
        if((int)left.front()<=(int)right.front()){
            result.push_back(left.front());
            //left.erase(left.begin());
        }
        else{
            result.push_back(right.front());
            //left.erase(right.begin());
        }
    }
        while((int)left.size()>0){
            for(int j=0; j<(int)left.size(); j++)
                result.push_back(left[j]);
        }
        while((int)right.size()>0){
            for(int k=0; k<(int)right.size(); k++)
                result.push_back(right[k]);
        }
    cout << "check merging";
    return result;
}

int main()
{
    vector<int> a, b, result;
    a.push_back(38);
    a.push_back(27);
    b.push_back(43);
    b.push_back(3);
    cout << a.front() << endl;
    print(a);
    cout << endl;
    print(b);
    cout << endl;
    result = merging(a, b);
    print(result);
}

謝謝

std::bad_alloc上的頁面

當operator new和operator new []的標准定義未能分配所請求的存儲空間時拋出的異常類型。

你的內存不足,當你不能再分配時會拋出異常。

嘗試查看循環的退出條件。

while((int)left.size()>0 && (int)right.size()>0)

leftright都為空之前,此循環不會退出,但是您永遠不會更改它們的大小( erase調用已被注釋掉)。

另外兩個while循環有類似的問題。

第一個while循環永遠不會終止。 它會不斷向結果中添加元素,直到內存耗盡為止。

你的代碼還有其他問題:在left.front()<= right.front的情況下你永遠不會刪除你從左邊放入的元素,它會被注釋掉。 在那個其他地方,你也不會從right移除。 注釋掉的代碼將從left移除,將right的迭代器混合到left的擦除中,技術上稱為“未定義的行為”意味着您的程序是吐司。

另外,為什么你到處都是int? 那太沒用了

即使你要從左前方和右前方擦除,你也可以使用向量從前面移除,這些操作不是由向量有效支持的。 有沒有需要做的是,你可以遍歷leftright使用迭代器,而不是檢查他們是否是空的左迭代器是否達到結束left以及是否正確到達迭代的末尾right

你有一個無限循環。

while((int)left.size()>0 && (int)right.size()>0)
{
    if((int)left.front()<=(int)right.front()){
        result.push_back(left.front());
        //left.erase(left.begin());
    }
    else{
        result.push_back(right.front());
        //left.erase(right.begin());
    }
}

永遠不會結束,因為你永遠不會從left刪除任何元素

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM