擦除集时的分段错误

时间:2014-12-01 12:12:48

标签: segmentation-fault set iteration erase

首先,以下代码产生了一个segmentatin错误,我不知道为什么。

    float currX;
    float currY;

    int id = 0;

    for(;it != s.end();){
        it_copy = it;
        pair<float,float> p = *it;
        currX = p.first;
        currY = p.second;

        currTresh = thresh;
        while(currTresh > 0 && it_copy != s.end()){
            pair<float,float> inner_p = *it_copy;
            currTresh--;
            if((inner_p.first-currX)<=secondThresh &&
                    abs(currY-inner_p.second)<=secondThresh){
                group.push_back(pair<int,KeyPoint>(id,KeyPoint(Point2f(p.first,p.second),9,-1,0,0,0)));
                s.erase(it_copy++);
            } else {
                ++it_copy;
            }
        }
        id++;
        it++;
    }

以下是该方案: 我尝试将一些点分组。 例如相似的点类似的坐标。例如 P1(10,5); P2(11,6); P3(11,50) 第1组(P1,P2);组2(P3)

我会意识到这一点。

set的使用带来的好处是删除了重复项,并对x和y坐标对进行了排序。

for循环应迭代整个集合。这里的迭代器&#39; it&#39;用来。 在内部while循环中,我将选择一定数量的s值,取决于tresh。 thresh和sencondThresh是10! 在while循环中,我设置了类似点被分组的条件。如果组I中的点插入将从集合中进行搜索。为了避免,同一个点位于不同的组中。 这就是线,我认为分段错误来自。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

您对erase的来电会修改s,使it无效。因此,在此之后您无法增加it

也许您打算it = it_copy;而不是it++;