0

これは私のマージソート関数です。VC++Express2010で常に「ベクトル添え字が範囲外」エラーになる理由がわかりません。

vector<int> Ordinatore::doMerge(vector<int> &v1, vector<int> &v2) {
int dimV1 = v1.size();
int dimV2 = v2.size();

int dimTotale = dimV1 + dimV2;
vector<int> merged; 

int lh, rh;
lh=0;rh=0;


while(lh < dimV1)  {


    if (rh < dimV2 && v1[lh] <= v2[rh]) {

        merged.push_back(v1[lh]);

        lh++;
        /* the trouble should start here as far as I've seen with cout & debugging */
        while (rh < dimV2  && v2[rh] <= v1[lh]) {

            merged.push_back(v2[rh]);

            rh++;

        }

    }
    else {

        while (rh < dimV2  && v2[rh] <= v1[lh]) {
            merged.push_back(v2[rh]);
            rh++;
        }
        merged.push_back(v1[lh]);

        lh++;

    }
}

return merged;
}
4

1 に答える 1

0

問題はループの一番上にあります:

while(lh < dimV1)  {
    if (rh < dimV2 && v1[lh] <= v2[rh]) {
        merged.push_back(v1[lh]);
        lh++;                                       // |<-- Problem
        while (rh < dimV2  && v2[rh] <= v1[lh]) {   // |
           ...
        }
    }
    else {
        ...
        lh++;
    }
}

lh++のそれelseが実行されると、lhがインクリメントされてwhile(lh < dimV1)再起動します。それがずっとそれを作ったと仮定しましょうlh == dimV1 - 1...

  • if条件がと評価された場合、trueトラブルはここから開始する必要lh++があります」とマークした場合に正しく実行されます。
  • 次の行は、現在は等しいが、インデックス作成に使用しているwhile (rh < dimV2 && v2[rh] <= v1[lh])ため、クラッシュが発生します。lhdimV1v1

マージソートの詳細については、このウィキペディアの記事を参照してください。

于 2013-02-01T00:59:48.727 に答える