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
Libérer: 2024-10-31 06:31:30
original
1117 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal