Heim >Backend-Entwicklung >C++ >Warum liefert meine C-Iterator-Entfernungsberechnung unerwartete Ergebnisse?
In C stellen Iteratoren ein leistungsstarkes Mittel zum Durchlaufen und Zugreifen auf Elemente innerhalb von Containern dar. Allerdings kann ihre Verwendung manchmal nuanciert sein und zu unerwarteten Ergebnissen führen. Stellen Sie sich das folgende Szenario vor:
Beim Versuch, den Abstand zwischen in einem Vektor gespeicherten Punkten zu berechnen, weichen die erwarteten Ergebnisse (0, 1,4, 1,4, 0) vom tatsächlichen Ergebnis ab ( 0, 1, -1, 0). Diese Diskrepanz könnte auf ein Problem mit der Iteratornutzung zurückzuführen sein.
Der bereitgestellte Code verwendet einen Vektor von Punkten mit benutzerdefinierter Abstandsberechnung mithilfe einer Funktion:
<code class="cpp">typedef struct point { float x; float y; } point; float distance(point *p1, point *p2) { return sqrt((p1->x - p2->x) * (p1->x - p2->x) + (p1->y - p2->y) * (p1->y - p2->y)); }</code>
Innerhalb der Hauptfunktion werden Iteratoren definiert und verwendet, um den Vektor zu durchlaufen:
<code class="cpp">vector<point>::iterator ii; vector<point>::iterator jj; for (ii = po.begin(); ii != po.end(); ii++) { for (jj = po.begin(); jj != po.end(); jj++) { cout << distance(ii, jj) << " "; } }</code>
Das Problem liegt im versehentlichen Aufruf von std::distance() aufgrund von Vorhandensein einer „using namespace std“-Direktive. Diese Funktion erwartet Iteratoren, aber der Code übergibt fälschlicherweise vector
Um das Problem zu beheben, ist es wichtig, den Standardbibliothekstypen das Präfix std:: voranzustellen und sicherzustellen, dass der Compiler die ordnungsgemäß kennzeichnet Nichtübereinstimmung der Funktionsparameter.
Darüber hinaus wird empfohlen, die Funktion so zu ändern, dass stattdessen Referenzen akzeptiert werden:
<code class="cpp">float distance(const point& p1, const point& p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); }</code>
Diese Änderung verhindert, dass die Funktion die übergebenen Punkte ändert.
Die zuvor verwendete Typdefinition kann in modernem C vereinfacht werden:
<code class="cpp">struct point { float x; float y; };</code>
Dadurch wird die unnötige C-ähnliche Syntax eliminiert und an C-Standards angepasst.
Das obige ist der detaillierte Inhalt vonWarum liefert meine C-Iterator-Entfernungsberechnung unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!