问题是,当我运行该函数时,它在erase部分崩溃,我无法弄清原因。

void Grupa::del() {
    int size = studenti.size();
    for (int i=0; i<size; i++) {
        if (studenti[i].materia1<5 && studenti[i].materia2<5 && studenti[i].materia3<5) {
        studenti.erase(studenti.begin()+i);
        }
    }
}

最佳答案

擦除元素时, vector 变小;但您仍在使用原始大小,并且逐渐下降。另外,您也不想在擦除后增加i,否则将在删除后跳过该元素。所以你想要像这样的东西:

for (size_t i = 0;
     i != studenti.size(); // don't hoist out of the loop
     /* don't increment here */)
{
    if (...) {
        studenti.erase(studenti.begin()+i);
    } else {
        ++i;
    }
}

或查看有关“删除擦除”惯用语的其他答案,这是一种避免此类容易出错的逻辑的好方法,而且可能更有效。

关于c++ - C++ STL vector 删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16799313/

10-10 22:42