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