首页 > 后端开发 > C++ > 正文

为什么在计算 C 向量中的点之间的距离时得到的距离不正确?

Linda Hamilton
发布: 2024-11-01 21:06:02
原创
627 人浏览过

Why am I getting incorrect distances when calculating distances between points in a C   vector?

C 向量中迭代器的正确使用

问题陈述:

计算向量中存储的点之间的距离时,获得不正确的结果,可能是由于迭代器使用不当造成的。

代码片段:

<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));
}

int main()
{
    vector<point> po;
    point p1; p1.x = 0; p1.y = 0;
    point p2; p2.x = 1; p2.y = 1;
    po.push_back(p1);
    po.push_back(p2);

    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) << " ";
        }
    }
    return 0;
}</code>
登录后复制

不正确的输出:

0
1
-1
0
登录后复制

解决方案:

问题是由于无意中调用了对迭代器进行操作的 std::distance() 函数而引起的。要解决此问题,请在标准库类型前添加 std:: 前缀,并将 distance() 函数更改为采用引用。

<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>
登录后复制

然后,使用取消引用的迭代器调用该函数:

<code class="cpp">distance(*ii, *jj);</code>
登录后复制

其他优化:

直接在 C 中使用结构体点来代替 typedef,因为不再需要在 typedef 中将其定义为结构体。

以上是为什么在计算 C 向量中的点之间的距离时得到的距离不正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!