C++ 调试错误:向量迭代器不可解引用且向量下标超出范围

C++ 调试错误:向量迭代器不可解引用且向量下标超出范围,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,我正在尝试实现无速率代码,但在解码时遇到了一些问题。 在第一个实现中,我使用迭代器在向量的向量上循环,并执行诸如擦除之类的操作,但我得到了一个调试错误:向量迭代器不可解引用。 在谷歌搜索之后,我找到了答案,所以我从迭代器切换到了索引,但我面临着同样的问题,我不知道如何解决。现在在调试模式下,我接收到的向量下标超出范围 变量的初始化: int k = 100; int n = 150; vector<int> output; // size of output is n vector&

我正在尝试实现无速率代码,但在解码时遇到了一些问题。 在第一个实现中,我使用迭代器在向量的向量上循环,并执行诸如擦除之类的操作,但我得到了一个调试错误:向量迭代器不可解引用。 在谷歌搜索之后,我找到了答案,所以我从迭代器切换到了索引,但我面临着同样的问题,我不知道如何解决。现在在调试模式下,我接收到的向量下标超出范围

变量的初始化:

int k = 100;
int n = 150;
vector<int> output; // size of output is n
vector< vector<int> > relationship(n);
vector<int> decoded(k);
int counterDecodedSymbols = 0;
vector< vector<int> >::iterator it = relationship.begin();
vector<int>::iterator jt;
bool found = false;
使用迭代器的第一个实现:

    while (counterDecodedSymbols < k) {
    int counter0 = 0;
    for (it = relationship.begin(); it != relationship.end(); ++it) {       
        if (it->size() == 1) {
            ++counterDecodedSymbols;
            jt = it->begin();
            decoded[*jt] = output[it - relationship.begin()];
            found = true;
            break;
        }
        ++counter0;
    }

    if (!found) {
        break;
    }

    int counter1 = 0;

    for (vector< vector<int> >::iterator zt = relationship.begin(); zt != relationship.end(); ++zt) {
        for (vector<int>::iterator kt = zt->begin(); kt != zt->end(); ++kt) {
            if (it == relationship.end()) {
                cout << "Ops" << endl;
            }
            if (*kt == *jt && zt != it) {
                output[zt - relationship.begin()] ^= output[it - relationship.begin()];
                if (zt->size() != 1) {
                    kt = zt->erase(kt);
                }
                else {
                    zt = relationship.erase(zt)
                }
                break;
            }
        }
        if (zt == relationship.end()) {
            cout << "Ops" << endl;
        }
        ++counter1;
    }
    it = relationship.erase(it);
}
第二个是带索引的实现:

int it = 0;
int jt = 0;

while (counterDecodedSymbols < k) {
    for (it = 0; it < relationship.size(); ++it) {
        if (relationship[it].size() == 1) {
            ++counterDecodedSymbols;
            jt = relationship[it][0];
            decoded[jt] = output[it];
            found = true;
            break;
        }
    }

    if (!found) {
        break;
    }

    for (int zt = 0; zt < relationship.size(); ++zt) {
        for (int kt = 0; kt < relationship[zt].size(); ++kt) {
            if (relationship[zt][kt] == relationship[it][0] && zt != it) {
                output[zt] ^= output[it];
                if (relationship[zt].size() != 1) {
                    relationship[zt].erase(kt + relationship[zt].begin());
                }
                else {
                    relationship.erase(zt + relationship.begin());
                }
                break;
            }
        }
    }
    relationship.erase(it + relationship.begin());
}
我在这里的第一个实现中遇到一个错误 对于vector::迭代器zt=relationship.begin;zt!=关系。结束++zt{ 使用调试器,我可以看到zt大小为0,关系大小为54,计数器1可以查看完成的循环数为55

我在这里的第一个实现中遇到了第二个错误 如果*kt==*jt&&zt!=it{ it大小现在为0,关系大小为33,计数器0为33

所以,第一次循环遍历it向量的大小,第二次循环遍历zt向量的大小。 我认为问题与擦除方法有关,但我不知道如何修复它

读完这篇文章后,我试图切换到索引,但问题还没有结束,我在这里遇到了一个错误 如果关系[zt][kt]==关系[it][0]&&zt!=it{ 其中it值为149,关系大小为149

我希望我是清楚的。 有人能帮我找到正确的方法吗?

只需在后面添加

if (!found) {
    break;
}


如果它是相等的relationship.size,则表示未找到任何项。无论如何,在每个for循环后,find没有更新为false,因此如果它只找到一个项,那么它确实找到了=true,并且find保持值true,即使在下一次迭代中找不到任何其他项。

在对s进行迭代时从向量中删除ame vector是出错的原因。为什么不使用调试器调试代码?不要猜测和/或反复试验,而是使用调试器确定错误所在。@PaulMcKenzie:这正是我从迭代器切换到索引的原因。与索引相同吗?关系[zt][kt]==关系[it][0]您使用它,它是在这一行上面声明和使用的。它的值是多少?正如您从问题中看到的,当错误开启时,它的值是149。关系大小是149.int i=0;对于i=0;i<10;++i{}执行循环后i的值是多少?是10?还是9?是10。这就是循环终止时它如何等于relationship.size。
else {
    found = false;
}