Maison > Article > développement back-end > Pourquoi le calcul de la distance de mon itérateur C donne-t-il des résultats inattendus ?
En C, les itérateurs fournissent un moyen puissant de parcourir et d'accéder aux éléments dans les conteneurs. Cependant, leur utilisation peut parfois être nuancée, conduisant à des résultats inattendus. Considérons le scénario suivant :
Lorsque vous tentez de calculer la distance entre des points stockés dans un vecteur, les résultats attendus (0, 1,4, 1,4, 0) s'écartent du résultat réel ( 0, 1, -1, 0). Cet écart peut provenir d'un problème d'utilisation de l'itérateur.
Le code fourni utilise un vecteur de points avec un calcul de distance personnalisé à l'aide d'une fonction :
<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>
Dans la fonction principale, les itérateurs sont définis et utilisés pour parcourir le vecteur :
<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>
Le problème réside dans l'invocation accidentelle de std::distance() en raison de la présence d'une directive "using namespace std". Cette fonction attend des itérateurs, mais le code transmet incorrectement vector
Pour résoudre le problème, il est crucial de préfixer les types de bibliothèques standard avec std::, en veillant à ce que le compilateur marque de manière appropriée le incompatibilité dans les paramètres de la fonction.
De plus, il est recommandé de modifier la fonction pour accepter les 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>
Ce changement interdit à la fonction de modifier les points qui lui sont transmis.
La typedef précédemment utilisée peut être simplifiée en C moderne :
<code class="cpp">struct point { float x; float y; };</code>
Cela élimine la syntaxe inutile de type C et s'aligne sur les normes C.
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!