Merge sort na vectorach - iterator out of range

0

Czemu ten kod wyrzuca błąd wyjścia iteratora poza zakres? (offset out of range)
problem chyba jest w pętli
wywołuje f(dane)

vector <int> merge(vector <int> veca, vector <int> vecb)
{
    vector <int> result;
    vector<int>::iterator it1 = veca.begin();
    vector<int>::iterator it2 = vecb.begin();
    while (it1 < veca.end()-1 && it2 < vecb.end()-1)   /* tu dzieje się coś nie tak */
    {

            if (*it1 < *it2)
            {
                result.push_back(*it1);
                if (it1 < veca.end() - 1)
                {
                    it1 += 1;
                }
            }

            if (*it1 > *it2)
            {
                result.push_back(*it2);
                if (it2 < vecb.end() - 1)
                {
                    it2 += 1;
                }
            }

    }
    return result;

}
vector <int> f (vector <int> vec){
    if(vec.size()==1){
        return vec;
    }
    else{
        int n = vec.size() / 2;
        vector <int> a;
        vector <int> b;
        a.insert(a.begin(), vec.begin(), vec.begin() + n);
        b.insert(b.begin(), vec.begin() + n, vec.end());
        return merge(f(a), f(b));
    }
}
0

Dlaczego Delor ? U mnie weszło. Może to zależy o danych, które wylosuje.
Napiszesz dlaczego według ciebie nie wchodzi ? Nie można tak porównywać wskaźników czy co ?

1

Funkcja f() rekurencyjnie wywołuje f() z wektorami o coraz mniejszej liczbie elementów. Dopiero jak dojdzie do jednoelementowych to wywoła merge().
Ten warunek:

while (it1 < veca.end()-1 && it2 < vecb.end()-1)

nie spełni się w takim przypadku i funkcja merge() zwróci puste result.
Przy pustym wektorze (ale to już w innym wywołaniu merge()) natrafiasz na to: veca.end()-1.

1

Chcesz zobaczyć czy iterator wskazuje na koniec kontenera? Do tego masz == i !=.
< jest do innych zastosowań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0