Maison >développement back-end >C++ >Pourquoi le calcul de la distance de mon itérateur C donne-t-il des résultats inattendus ?

Pourquoi le calcul de la distance de mon itérateur C donne-t-il des résultats inattendus ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 06:31:301094parcourir

Why Does My C   Iterator Distance Calculation Yield Unexpected Results?

Les nuances de l'utilisation des itérateurs : calcul de distance distinctive en C

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 :

Énoncé du problème

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.

Évaluation du code

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>

Résoudre le problème

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::iterator.

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.

Considérations supplémentaires

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn