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());
}
我在这里的第一个实现中遇到一个错误
对于vectorif (!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;
}