Énoncé du problème :
Lors du calcul des distances entre des points stockés dans un vecteur, un résultat incorrect est obtenu, potentiellement en raison d'une mauvaise utilisation des itérateurs.
Extrait de code :
<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>
Sortie incorrecte :
0 1 -1 0
Solution :
Le problème vient de l'appel sans le savoir de la fonction std::distance(), qui opère sur les itérateurs. Pour résoudre ce problème, préfixez les types de bibliothèques standard avec std:: et modifiez la fonction distance() pour prendre des références à la place.
<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>
Ensuite, appelez la fonction à l'aide d'itérateurs déréférencés :
<code class="cpp">distance(*ii, *jj);</code>
Optimisation supplémentaire :
Au lieu d'un typedef, utilisez le point de structure directement en C car il n'est plus nécessaire de le définir comme une structure dans typedef.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!