我可以在while循环中定义一个迭代器吗?

时间:2010-08-10 22:44:18

标签: c++

我的代码没有编译错误。它似乎有一个运行时错误。在下面的代码中,当第一次执行while循环时,一切正常。但是在第二次迭代中,一切都停在“list :: iterator k =(temp2-> store).begin();”。当我注释掉“list :: iterator k ...”部分时,一切正常。变量temp2和temp2->存储不是NULL或空。调试器给出了以下消息“项目euler.exe中0x009bc0cf处的未处理异常:0xC0000005:访问冲突读取位置0xddddddf5”。

 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++;
      }
  };

2 个答案:

答案 0 :(得分:2)

感谢您清理代码。看起来你在向量a上推送元素,然后在其他结构中将指针指向其元素。这样做的问题是“a”的大小调整(当你添加它时会发生)将导致其元素的指针(或迭代器)变得无效,并且当你在其上推送元素时会发生这种情况。我不知道这是否与您的代码有关,但它可能会导致问题。您可以将“a”更改为deque,当您添加到结尾时,它不会使指向其元素的指针无效,并且它应该修复该部分。

答案 1 :(得分:0)

当您的程序中止时,您获得的错误消息的更多详细信息可能会有所帮助,但无论如何我都会做出疯狂的猜测。如果您的temp2temp2->store值不为NULL,那么temp2->store可能是一个空容器?也就是temp2->store.begin() == temp2->store.end()。在尝试取消引用k之前,您可以尝试检查该案例。例如,您可以将while循环更改为

while(reached == 0 && k != temp2->store.end()) {
    .
    .
    .
}

如果temp2->store为空,则begin迭代器等于end迭代器,并且取消引用end迭代器是坏的。因此,即使最终不是问题,您也应该检查以防止它。