2010-08-15 64 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

相關問題