2016-12-02 78 views
0

这是我运行的代码:段错误从矢量擦除时,而在嵌套循环

for(auto candidate = candidates.begin(); candidate != candidates.end();) { 
    for(auto inst = candidate->sortedLoads.begin(); inst != candidate->sortedLoads.end(); inst++) { 
     if(...) { 
      candidate = candidates.erase(candidate); 
      break; 
     } 

     else { 
      candidate++; 
     } 
    }   
} 

运行与上方的段错误。如果我删除内部的for循环段落错误消失。你们知道有什么问题吗?

回答

0

编辑
你从外循环递增的candidate变量在内部循环,在那里没有什么可以阻止他以超过其上界candidate != candidates.end()。至少将这个条件添加到你的内部循环中。你会结束:

for(auto candidate = candidates.begin(); candidate != candidates.end();) { 
    for(auto inst = candidate->sortedLoads.begin(); candidate != candidates.end() && inst != candidate->sortedLoads.end() ; inst++) { 
     if(...) { 
      candidate = candidates.erase(candidate); 
      break; 
     } 

     else { 
      candidate++; 
     } 
    } 
} 

但总的来说,如果你将递增/递减(或任何操作改变的值),循环变量的另一循环内,你需要重复第一循环条件(其中变量来自)在第二个循环(它被改变的地方)!

+0

是的,刚刚意识到这一点,当我盯着确保格式化是正确的。谢谢! –

+1

真的很接近,但是当'候选人'从它下面改变时错过了'inst'的改变。 – user4581301

+0

好点,我离开了最后的简化。这种情况并不正确。我也在内部循环中切换条件。 Thanx @ user4581301。 Prasanna UV,你必须小心谨慎 –

0

问题1:

inst = candidate->sortedLoads.begin(); 

inst是一个迭代内部candidate东西。如果candidate被删除,那么inst是指什么?没人知道。

问题2:假设你只是递增了candidateinst仍然是一个有效的参考。

inst != candidate->sortedLoads.end() 

inst是指在第一candidatesortedLoads的条目和针对被在另一candidate另一个sortedLoadsend比较。在发生不良情况之前,退出条件几乎肯定不会得到满足。

问题3:J.Baoby已经覆盖了:在内循环中没有超过candidate的结尾的测试。

对这个问题没有一个很好的解决方案。建议尝试解决instcandidate之间的逻辑。

+0

即使我在erase()的内部循环中突破,问题1是个问题吗?问题2和3是合乎逻辑的缺陷,同意。 –

+0

@PrasannaUV我错过了'break'。你应该有一个节拍。 – user4581301

+0

当您增加候选人时,您可以通过添加额外的“break”来解决问题2。但是这意味着你的内部循环将毫无意义......一个if-else结构,在这两种情况下,循环都被打破了! =>不需要内部循环 –