在循环内使用 list.push_back(),绕过使迭代器无效
use list.push_back() inside loop, get around invalidate iterator
我想在循环中使用函数 .push_back()
而不会弄乱迭代器并陷入无限循环。如果验证了列表中现有项目的某些条件,则创建一个新对象并将其附加到列表末尾。
如何?
我注意到当我使用 push_front()
而不是 push_back()
时没有问题。为什么?
push_back()
会影响.end()
和push_front()
.begin()
的价值吗?
备注:
- 我不能使用基于
list.size()
的循环我需要访问对象进行测试。
- 因为我使用的是双嵌套循环,所以我认为在这种情况下 for 循环比 while 更合适。
我不需要在列表末尾检查(到达)新添加的项目。
void fct(list<myclass *>& lst) {
list<myclass *>::iterator it1,it2;
for ( it=lst.begin();it1 != lst.end();it1++) {
if (condition on *it1) {
for ( it2=lst.begin();it2 != lst.end();it2++) {
if (condition on *it2) {
myclass *newobj = new myclass();
lst.push_back(newobj);
//infinite loop here in second loop
}
}
}
}
}
for ( it2=lst.begin();it2 != lst.end();it2++) {
//test on *it2
myclass *newobj = new myclass();
lst.push_back(newobj);
//infinite loop here in second loop
}
这是一个无限循环,因为"next" link来自节点it2
的跟踪将连接到新节点,然后迭代器移动到刚刚插入的节点并且你一次又一次地做.....你可以在之前递增it2
做push_back
,然后用end()
记录相等性, after 如果 push_back
相等,break
退出循环。请记住从 for
语句中删除 ++it2
否则您将处理交替元素(并且可能会尝试以 未定义的行为 超越 end()
).
您可以使用相同的见解来确定是否需要为外循环做些事情。
我想在循环中使用函数
.push_back()
而不会弄乱迭代器并陷入无限循环。如果验证了列表中现有项目的某些条件,则创建一个新对象并将其附加到列表末尾。如何?
我注意到当我使用
push_front()
而不是push_back()
时没有问题。为什么?push_back()
会影响.end()
和push_front()
.begin()
的价值吗?
备注:
- 我不能使用基于
list.size()
的循环我需要访问对象进行测试。 - 因为我使用的是双嵌套循环,所以我认为在这种情况下 for 循环比 while 更合适。
我不需要在列表末尾检查(到达)新添加的项目。
void fct(list<myclass *>& lst) { list<myclass *>::iterator it1,it2; for ( it=lst.begin();it1 != lst.end();it1++) { if (condition on *it1) { for ( it2=lst.begin();it2 != lst.end();it2++) { if (condition on *it2) { myclass *newobj = new myclass(); lst.push_back(newobj); //infinite loop here in second loop } } } } }
for ( it2=lst.begin();it2 != lst.end();it2++) {
//test on *it2
myclass *newobj = new myclass();
lst.push_back(newobj);
//infinite loop here in second loop
}
这是一个无限循环,因为"next" link来自节点it2
的跟踪将连接到新节点,然后迭代器移动到刚刚插入的节点并且你一次又一次地做.....你可以在之前递增it2
做push_back
,然后用end()
记录相等性, after 如果 push_back
相等,break
退出循环。请记住从 for
语句中删除 ++it2
否则您将处理交替元素(并且可能会尝试以 未定义的行为 超越 end()
).
您可以使用相同的见解来确定是否需要为外循环做些事情。