首页 >后端开发 >C++ >为什么我的 C 迭代器距离计算会产生意外结果?

为什么我的 C 迭代器距离计算会产生意外结果?

Barbara Streisand
Barbara Streisand原创
2024-10-31 06:31:301096浏览

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