用于循环迭代生长向量

时间:2015-02-05 10:40:40

标签: c++ loops for-loop dynamic vector

我的问题是,总是下面的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);
       }
       ......
   }

如何根据生长的向量使循环迭代多次?即使将某些内容推送到搜索列表,它也不会多次迭代。如果添加了某些内容,则应将发现设置为该元素并重新进入循环。

3 个答案:

答案 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循环时)。