合并排序

时间:2015-06-16 15:42:00

标签: c++ vector

我正在尝试使用c ++中的vector实现合并排序,我收到以下错误 - 抛出' std :: bad_alloc'的实例后终止调用。 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);
}

谢谢

3 个答案:

答案 0 :(得分:2)

来自std::bad_alloc

上的页面
  

当operator new和operator new []的标准定义未能分配所请求的存储空间时抛出的异常类型。

你的内存不足,当你不能再分配时会抛出异常。

尝试查看循环的退出条件。

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

leftright都为空之前,此循环不会退出,但是您永远不会更改其大小(erase调用已被注释掉。)

另外两个while循环有类似的问题。

答案 1 :(得分:1)

第一个while循环永远不会终止。它会不断向结果中添加元素,直到内存耗尽为止。

您的代码还有其他问题: 在left.front()&lt; = right.front的情况下,你永远不会从左边删除你输入的元素,它会被注释掉。 在其他情况下,您也不会从right中删除。注释掉的代码将从left中删除,将right的迭代器混合到left的擦除中,技术上称为“未定义的行为”,意味着您的程序是吐司。

另外,为什么你到处投射到int?那太没必要了

即使您要从左前方和右前方擦除,也可以使用矢量从前面移除,矢量不能有效支持这些操作。没有必要这样做,您可以使用迭代器遍历leftright,检查它们是否为空,因为左迭代器是否到达left的末尾以及是否正确迭代器到达right

的末尾

答案 2 :(得分:0)

你有一个无限循环。

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

中删除任何元素