Dass Ihr Code überhaupt kompiliert wird, liegt wahrscheinlich daran, dass Sie using namespace stdirgendwo einen haben. (Sonst vectormüsste es sein std::vector.) Davon würde ich abraten, und Sie haben gerade einen guten Fall angeführt, warum:
Ihr Anruf wird versehentlich entgegengenommen std::distance(), was zwei Iteratoren erfordert und die Entfernung zwischen ihnen berechnet. Entfernen Sie die using-Direktive und stellen Sie allen Standardbibliothekstypen das Präfix voran, std::und der Compiler teilt Ihnen mit, dass Sie versucht haben, a zu übergeben, vector <point>::iteratorwo a point*erforderlich war.
Um einen Zeiger auf ein Objekt zu erhalten, auf das ein Iterator zeigt, müssen Sie den Iterator dereferenzieren - der einen Verweis auf das Objekt gibt - und die Adresse des Ergebnisses übernehmen : &*ii.
(Beachten Sie, dass ein Zeiger alle Anforderungen für einen std::vectorIterator perfekt erfüllen würde und einige frühere Implementierungen der Standardbibliothek tatsächlich Zeiger dafür verwendeten, wodurch Sie std::vectorIteratoren als Zeiger behandeln konnten. Moderne Implementierungen verwenden jedoch eine spezielle Iteratorklasse dafür Der Grund dafür ist, dass die Verwendung einer Klasse das Überladen von Funktionen für Zeiger und Iteratoren ermöglicht. Die Verwendung von Zeigern als std::vectorIteratoren fördert außerdem das Mischen von Zeigern und Iteratoren, wodurch verhindert wird, dass der Code kompiliert wird, wenn Sie Ihren Container ändern.)
Aber anstatt dies zu tun, schlage ich vor, dass Sie Ihre Funktion so ändern, dass stattdessen Referenzen verwendet werden (siehe diese Antwort, warum das sowieso eine gute Idee ist.):
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));
}
Beachten Sie, dass die Punkte von constReferenzen übernommen werden . Dies zeigt dem Anrufer an, dass die Funktion die übergebenen Punkte nicht ändert.
Dann können Sie es so nennen : distance(*ii,*jj).
Nebenbei bemerkt, dies
typedef struct point {
float x;
float y;
} point;
ist ein C-Ismus in C ++ unnötig. Buchstabiere es einfach
struct point {
float x;
float y;
};
Das würde Probleme structbereiten , wenn diese Definition jemals von einem C-Compiler analysiert werden sollte (der Code müsste struct pointdann nicht einfach darauf verweisen point), aber ich denke, std::vectorund dergleichen wäre für einen C-Compiler sowieso eine weitaus größere Herausforderung.
std.