c++ - 如何检索无效的迭代器?

标签 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 循环的某个地方,我的迭代器变得无效,因此它陷入了无限循环。但是如何让我的迭代器保持有效呢?

最佳答案

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

基本上,每次您在 vector 中 push_back 数据时,它都有可能被重新分配(除非您保留了足够的大小)。当 vector 被重新分配时,指向其元素的每个迭代器都会失效。

即使在插入/删除元素时,列表元素的迭代器几乎总是有效(只有被删除元素的迭代器变得无效)。

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

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

你必须证明这段代码永远不会使循环无限。只需在其中添加一个计数器并打印它的值,然后添加一个计数器来计算循环次数并打印它。

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

因此,您可能会在开始处删除一个元素并在末尾添加一个元素,并且您对“结束”迭代器的检查变得像狗咬尾部一样。

还有:

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

也许你可以使用

list.push_front

?

已删除更新

关于c++ - 如何检索无效的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195364/

相关文章:

c++ - PyQt : how to handle auto-resize of widgets when their content changes

C++将解析器的结果放入数组

c++ - 在Qt中制作情节

python - 使用 Pandas 查找两个不同大小的数据帧之间的不同行

c++ - 循环重复次数超过预期的模式匹配

java - Java中Iterable的实现

c++ - 从网络摄像头预览捕获图像的最佳 DirectShow 方式? SampleGrabber 已弃用

c - 我如何按照 MATLAB 语法编写此 C 代码片段?

c++ - 在我自己的类上使用 std::inner_product

c++ - 如何在递归函数中使用迭代器