我的问题是,总是下面的for循环只迭代一次。
在进入循环之前,search_list大小始终为1.但search_list向量可能会在循环内增长,并且应该分别迭代以防将某个元素添加到列表中。
std::vector<int> search_list;
search_list.clear();
search_list.push_back(first_elem);
for(auto &discover : search_list)
{
......
if(&std::find(face_ids.begin(), face_ids.end(), i))
{
search_list.push_back(i);
}
......
}
如何根据生长的向量使循环迭代多次?即使将某些内容推送到搜索列表,它也不会多次迭代。如果添加了某些内容,则应将发现设置为该元素并重新进入循环。
答案 0 :(得分:3)
你的问题是迭代器是在你开始循环时创建的,但是当时没有更新。 你应该对索引执行for循环:
std::vector<int> search_list;
search_list.clear();
search_list.push_back(first_elem);
for (int ii=0 ; ii < search_list.size() ; ii++) {
......
if(&std::find(face_ids.begin(), face_ids.end(), i))
{
search_list.push_back(i);
}
......
}
这样,如果添加了一个元素,search_list.size()
将会增长并且循环将继续,因为它每次都会调用它。
请注意,如果始终验证if
语句,则会产生无限循环。
编辑:根据FélixCantournet的建议,这是一个带有while
循环和一些控件的版本,它不能无限期
int max_it = 1000;
int ii=0;
...
// i = MAGIC
...
while (&std::find(face_ids.begin(), face_ids.end(), i) && ii < max_it) {
search_list.push_back(i);
......
// i = NEW MAGIC
......
ii++;
}
答案 1 :(得分:1)
对添加或删除元素的容器执行操作 - 或调整大小 - 可以使该容器的所有迭代器无效。
基于for循环的范围假定迭代器不会失效,因此如果它们是,则会给出未定义的行为。从本质上讲,您需要采用传统的循环方式。如果容器被调整大小,则断开并重新启动外部循环(例如,将外部循环放在另一个根据需要继续运行的循环中)。
它通常涉及重构代码,但通常,避免在迭代同一容器的循环中调整容器大小更安全。实践中很少有情况是不可能的。
答案 2 :(得分:1)
问题在于,您不仅要更改循环中列表的end
(这会使使用基于范围的for循环无效),还可能使列表的所有iterators
无效(这使基于iterator
的循环失效。
因此,您必须求助于不会失效的事情。这个法案唯一适合的是指数。就像在Math的回答中一样。
但是,这意味着您的算法特定于使用vector
但不是list
(当您仍然可以使用基于iterator
的for循环时)。