在尝试分配向量时抛出Mergesort - std :: bad_alloc

时间:2010-08-15 16:32:00

标签: c++ mergesort bad-alloc

女士们和男士们,下午好。所以,这不是我错误的日子。在C ++中实现Mergesort(非就地),我遇到了代码真正的麻烦,不明白为什么。 mergeSort()函数的倒数第二行将merge()的结果分配给整数向量result。这一行(实际分配,而不是函数)引发bad_alloc错误,我不明白为什么。

互联网表明bad_alloc主要是由于内存不足错误引发的,但这种情况并非如此,因为第一次调用它是在一个500英寸的向量上,这应该也不是很接近很多内存(这是什么,就像32位int上的2 Kb一样?)。我假设我正在为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并在函数期间编辑它,它工作正常,但我想保持代码尽可能接近为merge-sort提供的'标准'伪代码。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:3)

Merge函数中,未返回vector<int> result