C++ 无法遍历STL集
我的程序中循环的配置方式有问题。在做了一点调试之后,我发现循环一直运行到最后一次迭代,就在temp与目标匹配之前<代码>EXC\u错误访问(代码=1,地址=0x0)被抛出,程序退出。(11)C++ 无法遍历STL集,c++,stl,C++,Stl,我的程序中循环的配置方式有问题。在做了一点调试之后,我发现循环一直运行到最后一次迭代,就在temp与目标匹配之前EXC\u错误访问(代码=1,地址=0x0)被抛出,程序退出。(11) bool是相邻的(字符串a、字符串b) { 整数计数=0; int n=a.长度(); 对于(int i=0;i1)返回false; } 返回计数==1?真:假; } int shortestChainLen(字符串和开始、字符串和目标、设置和D) { 队列Q; QItem项={start,1}; Q.推动
bool是相邻的(字符串a、字符串b)
{
整数计数=0;
int n=a.长度();
对于(int i=0;i1)返回false;
}
返回计数==1?真:假;
}
int shortestChainLen(字符串和开始、字符串和目标、设置和D)
{
队列Q;
QItem项={start,1};
Q.推动(项目);
而(!Q.empty())
{
QItem curr=Q.front();
Q.pop();
for(set::iterator it=D.begin();it!=D.end();it++)
{
字符串temp=*it;
如果(是相邻的(当前字、临时))
{
item.word=temp;
item.len=当前len+1;
Q.推动(项目);
D.擦除(温度);
如果(温度==目标)
返回item.len;
}
}
}
返回0;
}
这是XCode调试器发现的,但我不确定如何解释它。
问题是您正在删除迭代器当前指向行的集合的元素
D.erase(temp);
当这种情况发生时,迭代器将失效,对它的任何进一步使用都是未定义的行为。您希望将代码的结构改为:
for (set<string>::iterator it = D.begin(); it != D.end();) {
if (isadjacent(curr.word, *it)) {
item.word = *it;
item.len = curr.len + 1;
Q.push(item);
it = D.erase(it);
if (item.word == target)
return item.len;
} else {
++it;
}
}
for(set::iterator it=D.begin();it!=D.end();){
如果(是相邻的(curr.word,*it)){
item.word=*it;
item.len=当前len+1;
Q.推动(项目);
它=D.擦除(它);
如果(item.word==目标)
返回item.len;
}否则{
++它;
}
}
使用
erase
方法,获取迭代器并返回引用下一项的迭代器。感谢您的快速响应。我已经为此工作了几个小时,真不敢相信我错过了。
for (set<string>::iterator it = D.begin(); it != D.end();) {
if (isadjacent(curr.word, *it)) {
item.word = *it;
item.len = curr.len + 1;
Q.push(item);
it = D.erase(it);
if (item.word == target)
return item.len;
} else {
++it;
}
}