For 循环遍历生长向量
For loop iterating over growing 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);
}
......
}
我怎样才能使这个 for 循环根据增长的向量迭代多次?即使将某些内容推送到搜索列表,它也不会迭代多次。如果添加了一些东西,它应该将发现设置为该元素并重新进入循环。
您的问题是迭代器是在您开始循环时创建的,但随后没有更新。
您应该对索引执行 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élix Cantournet 的建议,这里有一个带有 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++;
}
对容器执行添加或删除元素或调整大小的操作会使该容器的所有迭代器失效。
基于范围的 for 循环假定迭代器未失效,因此如果无效,将给出未定义的行为。本质上,您需要求助于传统循环。如果调整了容器的大小,则中断并重新启动外循环(例如,将您的外循环放在另一个根据需要继续运行的循环中)。
它通常会涉及重构代码,但通常更安全的做法是避免在迭代同一容器的循环中调整容器的大小。在实践中,几乎没有什么情况是不可能的。
问题是您不仅在循环内更改了列表的 end
(这使基于范围的 for 循环的使用无效),而且还可能使所有 iterators
无效列表(使基于 iterator
的 for 循环无效。
所以,你必须求助于不会失效的东西。唯一适合这个法案的是索引。正如 Math 的回答。
但是,这意味着您的算法特定于使用 vector
而不是 list
(当您仍然可以使用基于 iterator
的 for 循环时).
我的问题是,下面的 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);
}
......
}
我怎样才能使这个 for 循环根据增长的向量迭代多次?即使将某些内容推送到搜索列表,它也不会迭代多次。如果添加了一些东西,它应该将发现设置为该元素并重新进入循环。
您的问题是迭代器是在您开始循环时创建的,但随后没有更新。 您应该对索引执行 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élix Cantournet 的建议,这里有一个带有 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++;
}
对容器执行添加或删除元素或调整大小的操作会使该容器的所有迭代器失效。
基于范围的 for 循环假定迭代器未失效,因此如果无效,将给出未定义的行为。本质上,您需要求助于传统循环。如果调整了容器的大小,则中断并重新启动外循环(例如,将您的外循环放在另一个根据需要继续运行的循环中)。
它通常会涉及重构代码,但通常更安全的做法是避免在迭代同一容器的循环中调整容器的大小。在实践中,几乎没有什么情况是不可能的。
问题是您不仅在循环内更改了列表的 end
(这使基于范围的 for 循环的使用无效),而且还可能使所有 iterators
无效列表(使基于 iterator
的 for 循环无效。
所以,你必须求助于不会失效的东西。唯一适合这个法案的是索引。正如 Math 的回答。
但是,这意味着您的算法特定于使用 vector
而不是 list
(当您仍然可以使用基于 iterator
的 for 循环时).