如何检索无效的迭代器?

时间:2014-01-17 20:35:03

标签: c++ for-loop iterator

嗯,标题说明了一切。

我有这段代码:

std::list<vector<Plane>> list;
std::list<vector<Plane>>::iterator possible_planes_it;

...

for(possible_planes_it = list.begin(); possible_planes_it != 
    list.end(); possible_planes_it++)
{
        if(static_cast<float>(good_matches.size()) >= static_cast<float>((matches.size())*0.8))
        {
        if(possible_planes_it->back().getTimestamp() < count) // Means that there has not been a match found this round
        {
            possible_planes_it->push_back(Plane(area, *center_it, keypoint, descriptor, count));
            possible_planes_it->back().setNumberOfGoodMatches(good_matches.size());
        }
        else
        {
            if(possible_planes_it->back().getNumberOfGoodMatches() < good_matches.size())
            {
                possible_planes_it->pop_back(); // If a better match has been found, remove the last vector entry and push the new one
                possible_planes_it->push_back(Plane(area, *center_it, keypoint, descriptor, count));
                possible_planes_it->back().setNumberOfGoodMatches(good_matches.size());
            }
            else
            {
                list.push_back(vector<Plane>());
                list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count));
            }
        }
    }
    else
    {
        list.push_back(vector<Plane>());
        list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count));
    }
}

在这个for循环的某处,我的迭代器变得无效,因此它被卡在无限循环中。但是如何让迭代器保持有效?

2 个答案:

答案 0 :(得分:1)

您只需要查看cppreference.com或cplusplus.com以查看迭代器的有效性

基本上每次在向量中推送数据时,都有可能重新分配(除非你保留了足够的大小)。当vector被重新分配时,其元素的EACH迭代器无效。

列出元素的迭代器几乎总是保持有效,即使插入/擦除元素(只有迭代器擦除的元素变得无效)。

无限循环可能是您在每次迭代时向列表中添加1个元素

{
    list.push_back(vector<Plane>());
    list.back().push_back(Plane(area, *center_it, keypoint, descriptor, count));
}

您必须证明此代码永远不会使循环无限。只需在那里添加一个计数器并打印其值,然后计数一个计数循环数并打印它。

基本上,如果你有迭代器到last-1 list元素,并且你添加了一个元素,那么last-1 list元素迭代器将成为last-2 list element iterator。

所以你可能在开始时删除了一个元素并在结尾添加了一个元素,并且你对“end”迭代器的检查就像一只狗咬着它的尾巴。

此外:

无效的迭代器将首先导致段错误。 可能您的问题与迭代器有效性无关

也许你可以使用

list.push_front

更新已取消

答案 1 :(得分:1)

因为std::list

,您的迭代器不会失效
    Addition, removal and moving the elements within the list
    or across several lists does not invalidate the iterators.
    An iterator is invalidated only when the corresponding
    element is deleted.

来自here
由于您没有删除任何元素,因此没有任何迭代器失效。

发生的是你的'possible_planes_end'迭代器总是指向列表的末尾(即使在添加元素之后),因此你的问题可以简化为这个小片段:

   #include <list>

    int main()
    {
        std::list<float> l;
        std::list<float>::iterator i = l.begin(), end = l.end();
        do
        {
            l.push_back(1);
            i++;
        }while(i != end);
    }

这是永远运行的,因为l的大小每个循环增加一个,i一直指向倒数第二个元素。永远。