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 大小为 0relationship 大小为 54counter1(查看完成了多少循环)为 55.

我在这里收到第二个错误(在第一个实现中) if (*kt == *jt && zt != it) { it 尺码现在是 0relationship 尺码是 33counter033

因此,第一次循环遍历 it 向量的大小,第二次循环遍历 zt 向量的大小。 我认为问题与 erase 方法有关,但我不知道如何解决它。

看完thispost,我尝试切换到索引,但是问题还没有结束,我这里报错了 if (relationship[zt][kt] == relationship[it][0] && zt != it) { 其中 it 值为 149relationship 大小为 149.

希望我说的很清楚。 有人可以告诉我正确的方法吗?

只需要在后面添加

if (!found) {
    break;
}

那个

else {
    found = false;
}

如果 it 等于 relationship.size() 则表示没有找到任何项目。无论如何,found 并没有在每次 for 循环后更新为 false,所以如果它只找到一次一个项目,它会 found = true,并且 found 保持值 true 即使在下一次迭代中找不到其他项目。