Heim > Artikel > Backend-Entwicklung > Warum erhalte ich falsche Abstände, wenn ich Abstände zwischen Punkten in einem C-Vektor berechne?
Problemstellung:
Bei der Berechnung von Abständen zwischen in einem Vektor gespeicherten Punkten Es wird ein falsches Ergebnis erhalten, möglicherweise aufgrund einer unsachgemäßen Verwendung von Iteratoren.
Code-Snippet:
<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)); } int main() { vector<point> po; point p1; p1.x = 0; p1.y = 0; point p2; p2.x = 1; p2.y = 1; po.push_back(p1); po.push_back(p2); 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) << " "; } } return 0; }</code>
Falsche Ausgabe:
0 1 -1 0
Lösung:
Das Problem entsteht durch den unwissentlichen Aufruf der Funktion std::distance(), die auf Iteratoren arbeitet. Um dieses Problem zu beheben, stellen Sie Standardbibliothekstypen das Präfix std:: voran und ändern Sie die Funktion distance() so, dass stattdessen Referenzen angenommen 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>
Dann rufen Sie die Funktion mit dereferenzierten Iteratoren auf:
<code class="cpp">distance(*ii, *jj);</code>
Zusätzliche Optimierung:
Anstelle einer Typedef verwenden Sie den Strukturpunkt direkt in C, da es nicht mehr notwendig ist, ihn als Struktur in der Typedef zu definieren.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich falsche Abstände, wenn ich Abstände zwischen Punkten in einem C-Vektor berechne?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!