在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」指令。此函數需要迭代器,但程式碼錯誤地傳遞了向量
要修正此問題,在標準函式庫類型前加上 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中文網其他相關文章!