问题是,当我运行该函数时,它在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/