C ベクトル内の点間の距離を計算するときに不正確な距離が得られるのはなぜですか?

Linda Hamilton
リリース: 2024-11-01 21:06:02
オリジナル
627 人が閲覧しました

Why am I getting incorrect distances when calculating distances between points in a C   vector?

C ベクトルでの反復子の正しい使用法

問題ステートメント:

ベクトルに格納された点間の距離を計算する場合、イテレータの不適切な使用が原因である可能性があります。

コード スニペット:

<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>
ログイン後にコピー

不正な出力:

0
1
-1
0
ログイン後にコピー

解決策:

この問題は、反復子で動作する std:: distance() 関数を無意識のうちに呼び出すことで発生します。これを解決するには、標準ライブラリ型の先頭に std:: を付け、代わりに参照を取得するように distance() 関数を変更します。

<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>
ログイン後にコピー

次に、逆参照イテレータを使用して関数を呼び出します。

<code class="cpp">distance(*ii, *jj);</code>
ログイン後にコピー

追加の最適化:

typedef で構造体として定義する必要がなくなったため、typedef の代わりに C で構造体ポイントを直接使用します。

以上がC ベクトル内の点間の距離を計算するときに不正確な距離が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!