首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有擦除元素的C++嵌套for循环

带有擦除元素的C++嵌套for循环
EN

Stack Overflow用户
提问于 2019-01-04 20:29:45
回答 3查看 216关注 0票数 0

我想检查向量的所有元素之间的相互关系。通过检查一个条件,应该删除一个元素。

一种方法是通过嵌套的for循环擦除元素

代码语言:javascript
复制
for (int a = 0; a < rs.size(); a++)
{
    Point A = rs[a];

    for (int b = 1; b <= rs.size(); b++)
    {
        Point B = rs2[b];
        float distance = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) * 1.0);

        if (distance < 10.0)
        {
            if (distance > 0)
            {
                rs.erase(rs.begin() + b);
            }
        }
    }
}

但这会在运行时影响向量和它的大小。

第二种方法是收集unordered_set中b的索引,但是如何删除原始向量中具有相应摘要索引的元素呢?

代码语言:javascript
复制
unordered_set<int> index;

for (int a = 0; a < rs.size(); a++)
{
    Point A = rs[a];

    for (int b = 0; b < rs.size(); b++)
    {
        Point B = rs2[b];
        float distance = sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2) * 1.0);

        if (distance < 10.0)
        {
            if (distance > 0)
            {
                index.insert(b);
            }
        }
    }
}

正如您可能预期的那样,这种方法也不起作用:

代码语言:javascript
复制
for (const int& idx : index)
{
    rs.erase(rs.begin() + idx);
}

有什么帮助吗?

EN

回答 3

Stack Overflow用户

发布于 2019-01-04 20:37:25

您可以在上一个建议中使用反向循环从向量中删除索引。只需将该index设为一个向量。让我们称它为toRemove

代码语言:javascript
复制
for (int i = toRemove.size() - 1; i >= 0; i--)
{
    rs.erase(rs.begin() + toRemove[i]);
}

只需小心,这个循环必须有一个带符号的索引。否则你可能会下溢。你可以用一个反向迭代器让它变得“更好”。这只是一个概念验证。

票数 1
EN

Stack Overflow用户

发布于 2019-01-04 21:01:44

为了尽可能的健壮,我会选择std::for_each。在对每个对象执行的函数中,大致如下:

对于是否保留该元素的条件,请执行计算necessary

  • check。如果要保留该元素,请将其添加到新的输出向量中,否则不执行

然后在完成后清除原始向量,并交换入和出向量。将对象移动到(智能!)-pointers以提高效率(减少复制)。

For_each与创建一个新的向量相结合,应该可以非常健壮地抵御使用std::vector时可能发生的潜在大小更改和重新分配。

票数 1
EN

Stack Overflow用户

发布于 2019-01-04 22:06:07

抱歉,伙计们,我把距离检查改到了插入点...

代码语言:javascript
复制
vector<Point> rois;
for (int y = 0; y < result.rows; y++)
{
    for (int x = 0; x < result.cols; x++)
    {
        float qt = result.at<float>(y, x);

        if (qt >= threshVal)
        {
            Point A = Point(x, y);

            bool isNear = true;

            if (rois.size() > 0)
            {
                for (Point &P : rois)
                {
                    float distance = sqrt(pow(P.x - A.x, 2) + pow(P.y - A.y, 2) * 1.0);

                    if (distance < 10.0)
                    {
                        isNear = false;
                        break;
                    }
                }
                if (isNear)
                {
                    rois.push_back(A);
                }
            }
            else
            {
                rois.push_back(A);
            }
        }
    }
}

这比以前的方法简单得多。

不过还是要谢谢你的回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54038997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档