0

ベクトルまたは単語ノード (単語の長さ、出現回数、および単語自体を含む) を並べ替えるために、このマージソート関数を作成しようとしています。一度マージ関数に入ったようですが、プログラムは失敗します。

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;
}
4

1 に答える 1

1

あなたのright.erase(right.erase(right.begin()));コードは危険に見えます。この関数は、最後の要素を削除した場合、erase削除された要素の後続要素にイテレータを返します。end()

right.size() > 0アイテムが1つだけであることを保証するこのコードを保護して います。2 つの消去操作があります。

を行うことの結果を調べましたeraseright.end()?

于 2012-04-10T01:59:57.497 に答える