在 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中文网其他相关文章!