ich Iteratoren studiere und haben für 3 Tage auf, herauszufinden, warum verwenden wir stecken geblieben:Binäre Suche mit Iteratoren, warum verwenden wir "(end - begin)/2"?
auto mid = text.begin() + (end - beg)/2;
Code:
int main()
{
vector<int> text{ 10,9,8,7,6,5,4,3,2,1 };
int sought = 3;
// text must be sorted
// beg and end will denote the range we're searching
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2; // original midpoint
// while there are still elements to look at and we haven't yet found sought
while (mid != end && *mid != sought) {
if (sought < *mid) // is the element we want in the first half?
end = mid; // if so, adjust the range to ignore the second half
else // the element we want is in the second half
beg = mid + 1; // start looking with the element just after mid
mid = beg + (end - beg)/2;// new midpoint
}
system("pause");
}
warum tun
auto mid = text.begin() + (end - beg)/2;
und nicht:
auto mid = text.begin() + text.size()/2;
Bitte helfen Sie.
Sie *** wir *** Verwendung "(Ende - beginnen)/2"? Wo hast du das gefunden? – Wolf
@Wolf - C++ Grundierung 5. Auflage. Es ist ein wenig irreführend, wie das Buch in Kapitel 3.4 sagt, dass dies ein "klassischer Algorithmus" ist. Ich nahm an, dass dies ein häufiges Vorkommnis war (korrigiere mich, wenn ich falsch liege) – jibzoiderz
Der Grund dafür ist, dass das Beispiel die binäre Suche implementiert die Hauptfunktion. Wenn es ordnungsgemäß in eine Funktion extrahiert wurde, die nur einen Iterator-Bereich für die Suche benötigt, wäre klar, warum Sie die Größe des Containers nicht aufrufen können, da Sie nicht auf den Container verweisen können. –