首頁  >  文章  >  後端開發  >  為什麼我的 C 迭代器距離計算會產生意外結果?

為什麼我的 C 迭代器距離計算會產生意外結果?

Barbara Streisand
Barbara Streisand原創
2024-10-31 06:31:30990瀏覽

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>

在主函數中,定義了迭代器並用於遍歷向量:

<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>

解決問題

問題在於由於以下原因意外調用了std::distance()存在「using namespace std」指令。此函數需要迭代器,但程式碼錯誤地傳遞了向量::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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn