好吧,标题说明了一切。
我有这段代码:
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/