2010-08-15 58 views
3

下午好女人和男人。所以,这不是我犯错的日子。在C++中实现Mergesort(不是就地),我在代码中遇到了麻烦,不知道为什么。 mergeSort()函数的倒数第二行将merge()的结果分配给一个整数,result向量。这行(实际分配,而不是函数)抛出一个bad_alloc错误,我不知道为什么。Mergesort - std :: 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和功能时编辑它,它工作正常,但我想保持代码尽可能接近的“标准'伪码给合并排序。

我感谢任何帮助,谢谢。

+0

我明白你为什么不想使用引用,但我认为你应该重新考虑这一点。为了使代码更好更快,而不是传递向量,为什么不仅仅使用索引?所以递归调用只会得到开始和结束索引以及对正在排序的向量的引用。 – PeterK 2010-08-15 16:43:25

+1

因为这是一个in-place合并排序,并且稍后会被编码。我正在为自己编写一个排序算法库。为了娱乐。是的,我需要帮助。 – Stephen 2010-08-15 16:45:08

+0

有趣的编码东西是:) – PeterK 2010-08-15 16:48:23

回答

3

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

+0

...软糖。 XD。谢谢你,这是那些日子之一...... – Stephen 2010-08-15 16:38:47

+0

@Stephen:你应该使用编译器设置来告诉你这个(例如GCC的'-Wreturn-type'和'-Werror = ...')。 – 2010-08-15 16:40:30

+0

有讽刺意味的是,我今天早些时候曾帮助某人找到编译器设置,以便在编译他的代码时做出我刚才做的错误? = d。我会去得到Netbeans(是的,我在Netbeans编码!不要伤害我!)来打开这些,谢谢格奥尔格。 – Stephen 2010-08-15 16:44:02