好吧,标题说明了一切。

我有这段代码:

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循环中的某个地方,我的迭代器无效,因此卡在了无限循环中。但是,如何保持迭代器有效?

最佳答案

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

基本上,每次 vector 中的push_back数据都有被重新分配的机会(除非您保留了足够的大小)。重新分配vector时,对其元素的EACH迭代器无效。

即使插入/擦除元素,列出元素的迭代器几乎始终保持有效(只有TO到被删除元素的迭代器才无效)。

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

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

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

基本上,如果您有对last-1列表元素的迭代器,并添加了一个元素,则last-1列表元素的迭代器将成为last-2列表元素的迭代器。

因此,您可能在开始时删除了一个元素,并在结尾添加了一个元素,并且对“end”迭代器的检查就像一条狗咬住了它的尾巴。

也:

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

也许你可以使用
list.push_front



更新已删除

10-04 14:24
查看更多