ホームページ > バックエンド開発 > C++ > C イテレータの距離計算で予期しない結果が生じるのはなぜですか?

C イテレータの距離計算で予期しない結果が生じるのはなぜですか?

Barbara Streisand
リリース: 2024-10-31 06:31:30
オリジナル
1083 人が閲覧しました

Why Does My C   Iterator Distance Calculation Yield Unexpected Results?

イテレータの使用法の微妙な違い: C での距離計算の区別

C では、イテレータはコンテナ内の要素を走査してアクセスするための強力な手段を提供します。ただし、その使用には微妙な違いがあり、予期しない結果につながる場合があります。次のシナリオを考えてみましょう:

問題ステートメント

ベクトルに格納されている点間の距離を計算しようとすると、期待される結果 (0、1.4、1.4、0) が実際の結果 ( 0、1、-1、0)。この不一致は、イテレータの使用法に関する問題が原因である可能性があります。

コードの評価

提供されたコードでは、関数を使用したカスタム距離計算で点のベクトルが使用されています。

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

main 関数内で、反復子が定義され、ベクトルを走査するために使用されます。

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

問題の解決

問題は、 「using namespace std」ディレクティブの存在。この関数はイテレータを想定していますが、コードは間違って Vector::iterator を渡します。

問題を修正するには、標準ライブラリの型の前に std:: を付けて、コンパイラが適切にフラグを立てるようにすることが重要です。関数パラメータが一致しません。

さらに、代わりに参照を受け入れるように関数を変更することをお勧めします。

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

この変更により、関数が渡されるポイントを変更することが禁止されます。

その他の考慮事項

以前に採用されていた typedef は、最新の C で簡略化できます:

<code class="cpp">struct point {
    float x;
    float y;
};</code>
ログイン後にコピー

これにより、不必要な C のような構文が排除され、C 標準に準拠します。

以上がC イテレータの距離計算で予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート