Debug error: Vector iterator not dereferencable and Vector subscript out of range
Debug error: Vector iterator not dereferencable and Vector subscript out of range
我正在尝试实现无速率代码,但我在解码时遇到了一些问题。
在第一个实现中,我使用迭代器循环遍历向量的向量并执行一些操作(如 erase())但我收到此调试错误:Vector iterator not可取消引用。
经过一些谷歌搜索后,我找到了 this 答案,所以我从迭代器切换到索引,但我面临着同样的问题,我不知道如何弄清楚。现在在调试模式下,我收到 向量下标超出范围 。
变量初始化:
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());
}
我在这里收到一个错误(在第一个实现中)
for (vector< vector<int> >::iterator zt = relationship.begin(); zt != relationship.end(); ++zt) {
使用调试器,我可以看到 zt
大小为 0
,relationship
大小为 54
和 counter1
(查看完成了多少循环)为 55
.
我在这里收到第二个错误(在第一个实现中)
if (*kt == *jt && zt != it) {
it
尺码现在是 0
,relationship
尺码是 33
,counter0
是 33
。
因此,第一次循环遍历 it
向量的大小,第二次循环遍历 zt
向量的大小。
我认为问题与 erase
方法有关,但我不知道如何解决它。
看完thispost,我尝试切换到索引,但是问题还没有结束,我这里报错了
if (relationship[zt][kt] == relationship[it][0] && zt != it) {
其中 it
值为 149
,relationship
大小为 149
.
希望我说的很清楚。
有人可以告诉我正确的方法吗?
只需要在后面添加
if (!found) {
break;
}
那个
else {
found = false;
}
如果 it
等于 relationship.size()
则表示没有找到任何项目。无论如何,found
并没有在每次 for 循环后更新为 false
,所以如果它只找到一次一个项目,它会 found = true
,并且 found
保持值 true
即使在下一次迭代中找不到其他项目。
我正在尝试实现无速率代码,但我在解码时遇到了一些问题。 在第一个实现中,我使用迭代器循环遍历向量的向量并执行一些操作(如 erase())但我收到此调试错误:Vector iterator not可取消引用。 经过一些谷歌搜索后,我找到了 this 答案,所以我从迭代器切换到索引,但我面临着同样的问题,我不知道如何弄清楚。现在在调试模式下,我收到 向量下标超出范围 。
变量初始化:
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());
}
我在这里收到一个错误(在第一个实现中)
for (vector< vector<int> >::iterator zt = relationship.begin(); zt != relationship.end(); ++zt) {
使用调试器,我可以看到 zt
大小为 0
,relationship
大小为 54
和 counter1
(查看完成了多少循环)为 55
.
我在这里收到第二个错误(在第一个实现中)
if (*kt == *jt && zt != it) {
it
尺码现在是 0
,relationship
尺码是 33
,counter0
是 33
。
因此,第一次循环遍历 it
向量的大小,第二次循环遍历 zt
向量的大小。
我认为问题与 erase
方法有关,但我不知道如何解决它。
看完thispost,我尝试切换到索引,但是问题还没有结束,我这里报错了
if (relationship[zt][kt] == relationship[it][0] && zt != it) {
其中 it
值为 149
,relationship
大小为 149
.
希望我说的很清楚。 有人可以告诉我正确的方法吗?
只需要在后面添加
if (!found) {
break;
}
那个
else {
found = false;
}
如果 it
等于 relationship.size()
则表示没有找到任何项目。无论如何,found
并没有在每次 for 循环后更新为 false
,所以如果它只找到一次一个项目,它会 found = true
,并且 found
保持值 true
即使在下一次迭代中找不到其他项目。