2012-04-10 9 views
0

Ich versuche, diese Mergesort-Funktion zum Sortieren eines Vektors oder Wort Nodes (enthält Wortlänge, Anzahl der Vorkommen und das Wort selbst) Es scheint, die Merge-Funktion einmal eingeben, dann das Programm fehlschlägt, irgendwelche Ideen?C++ merge sort wird nicht zusammengeführt?

bool Utility::mergeSort_occurences(vector<Word> &invector){ 
    if (invector.size() <= 1){ 
     return true; 
    } 
    vector<Word> left, right; 
    int middle = (invector.size()/2); 
    for(int i = 0 ; i < middle ; i++){ 
     left.push_back(invector[i]); 
    } 
    for(int i = middle ; i < invector.size() ; i++){ 
     right.push_back(invector[i]); 
    } 
    mergeSort_occurences(left); 
    mergeSort_occurences(right); 
    invector = mergeOccurences(left, right); 
    return true; 
} 

vector<Word> Utility::mergeOccurences(vector<Word> &left, vector<Word> &right){ 
    vector<Word> mergelist; 
    while(left.size() > 0 || right.size() > 0){ 
     if(left.size() > 0 && right.size() > 0){ 
      if(left[0].getOccurences() <= right[0].getOccurences()){ 
       mergelist.push_back(left[0]); 
       left.erase(left.begin()); 
      }else{ 
       mergelist.push_back(right[0]); 
       right.erase(right.erase(right.begin())); 
      } 
     } 
     else if(left.size() > 0){ 
      mergelist.push_back(left[0]); 
      left.erase(left.begin()); 
     } 
     else if(right.size() > 0){ 
      mergelist.push_back(right[0]); 
      right.erase(right.erase(right.begin()));    
     } 
    } 
    return mergelist; 
} 
+1

Ja - Sie könnten es debuggen. Führen Sie den Code mit Ihrem Debugger mithilfe eines trivial kleinen Datasets in Ihrem Vektor aus. Vier Werte, sagen wir. Es sollte dann relativ einfach sein herauszufinden, wo das Problem liegt, viel einfacher als beispielsweise das Problem zu erkennen, indem man auf eine Seite mit komplexem Vektor/Array-Handhabungscode starrt, der von jemand anderem geschrieben wurde. –

Antwort

1

Ihr right.erase(right.erase(right.begin())); Code sieht zwielichtig aus. Die Funktion erase gibt einen Iterator an den Nachfolger des Elements zurück, das gelöscht wurde. Dies ist end(), wenn Sie das letzte Element gelöscht haben.

Sie bewachen diesen Code mit , die nur garantiert, dass es ein Element gibt. Sie haben zwei Löschvorgänge.

Haben Sie sich die Folgen von erase unter right.end() angesehen?