我可以在while循环中定义一个迭代器吗?
我的代码没有编译错误。它似乎有一个运行时错误。在下面的一段代码中,当第一次执行while循环时,一切正常。但在第二次迭代中,所有内容停在“list :: iterator k =(temp2-> store).begin();”。当我注释掉“list :: iterator k ...”部分时,一切正常。变量temp2和temp2-> store不是NULL或空的。调试器给出了以下消息:“项目euler.exe中的0x009bc0cf未处理的异常:0xC0000005:访问冲突读取位置0xddddddf5”。我可以在while循环中定义一个迭代器吗?
struct edge
{ int end1, end2;
ptr_to_edge *ptr_end1, *ptr_end2;
edge *next, *l_chd, *r_chd;
edge(): next(NULL), l_chd(NULL), r_chd(NULL), ptr_end1(NULL), ptr_end2(NULL)
{ }
};
struct ptr_to_edge {
int flag, vertex;
list<edge*> store;
ptr_to_edge(): flag(1)
{ }
};
void parallel_reduction_step(ptr_to_edge *front, vector<edge> &a) {
list<edge*>::iterator next = (front->store).begin();
next++;
list<edge*>::iterator current = (front->store).begin();
list<edge*>::iterator last = (front->store).end();
--last;
while(current!= last) {
if(((*current)->end1 == (*next)->end1)&&((*current)->end2==(*next)->end2)) {
edge temp1;
temp1.end1 = (*current)->end1; temp1.end2 = (*current)->end2;
a.push_back(temp1);
ptr_to_edge *temp2;
if ((*current)->end1==front->vertex)
temp2 = (*current)->ptr_end2;
else
temp2 = (*current)->ptr_end1;
list<edge*>::iterator k = (temp2->store).begin();
current = (front->store).erase(j);
*current = &(a.back());
}
else current++;
next++;
}
};
感谢您清理代码。它看起来像是在向量a上推入元素,然后在其他结构中指向其元素的指针。问题在于,“a”的大小(可能随着它的增加而发生)会导致指向其元素的指针(或迭代器)变为无效,并且可能会在您对其上的元素进行推送时发生。我不知道这是否与代码有关,但可能会导致问题。您可以将“a”更改为deque,在添加到最后时不会使指向其元素的指针无效,并且应该修复该部分。
我已经重新命名了迭代器。但迭代器最后(或从未编辑的帖子M)是不是问题.. – user416689 2010-08-10 23:05:56
我会试试看,并得到它回到你..我还包括结构定义,如果这将有任何帮助.. – user416689 2010-08-11 00:03:10
+ 1'deque'应该是事实上的容器! – 2010-08-11 09:00:29
有关程序中止时所得错误消息的更多详细信息可能会有所帮助,但无论如何我都会猜测。如果您的temp2
和temp2->store
值不为NULL,那么可能temp2->store
是一个空容器?那就是,temp2->store.begin() == temp2->store.end()
。在尝试解除引用k之前,您可以尝试检查该情况。例如,你可以在你的while循环改为
while(reached == 0 && k != temp2->store.end()) {
.
.
.
}
如果temp2->store
是空的,那么开始迭代器等于end迭代,以及解引用结束迭代器是坏的。所以你应该有一个检查来防止它,即使最终不是问题。
temp2->商店不是空的 – user416689 2010-08-10 23:20:10
它有可能是空的吗?在你的代码的任何用例中?即使它不能解决您的问题,我仍然会将该支票放在那里。它可能会在一段时间内避免另一个问题。 – 2010-08-10 23:29:14
在while条件中添加了k!= temp2-> store.end()部分。但问题似乎仍然存在。 – user416689 2010-08-10 23:35:19
对不起。如果我甚至无法阅读你的帖子,也无法帮助你。 – 2010-08-10 22:46:03
你的代码的第一个问题是你使用了太多的单字母变量,并且你嵌套了太多的块。这是完全不可读的。尝试使用明智的变量名称,并将该功能分解为组件部分,以便更容易理解和理解。 – 2010-08-10 22:47:55
@ user416689:第二次通过时temp2的值是多少?什么是temp2-> store的价值。我的猜测是temp2或temp2-> store是NULL。 – 2010-08-10 22:49:31