Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法遍历STL集_C++_Stl - Fatal编程技术网

C++ 无法遍历STL集

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.推动

我的程序中循环的配置方式有问题。在做了一点调试之后,我发现循环一直运行到最后一次迭代,就在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.推动(项目);
而(!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;
        }
    }