2012-04-10 75 views
0

我试图使这个mergesort函数来排序向量或单词节点(包含字长,出现次数和单词本身)它似乎进入合并函数一次,然后程序失败,任何想法?C++合并排序不会合并?

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

是的 - 你可以调试它。使用向量中的一个小数据集,使用调试器运行代码。说四个价值。然后,应该很容易地找出问题的所在,比试图通过盯着由其他人写的一页复杂的矢量/数组处理代码来发现问题要容易得多。 – 2012-04-10 01:18:55

回答

1

您的right.erase(right.erase(right.begin()));代码看起来不可靠。 erase函数将迭代器返回到已删除元素的后继元素,如果您删除了最后一个元素,则为end()

您正在用right.size() > 0守护此代码,它只保证有一个项目。你有两个擦除操作。

你看过eraseright.end()的影响吗?