所以当我运行这个函数时,我就是错误的
class vector <Record<value> >::iterator itr = records.begin();
for (; itr != records.end(); ++itr) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
}
}
我的向量是vector <Record <value> > records;
,而函数isSelected()
只是boolean
,当选择对象时为true,否则为{0}。
有人可以帮助我吗,我没有看到这样做的问题
答案 0 :(得分:5)
如果您要删除最后一个元素,itr
将首先为records.end()
,因为records.erase()
将返回该内容,然后您使用{{1}将其递增}}。尝试:
++itr
答案 1 :(得分:1)
你不应该像这样删除矢量元素,它不是一种有效的方法,因为在这个过程中你可能会多次重新分配矢量。
正确且更有效的方法是使用std :: erase函数。请参阅this question for examples。
答案 2 :(得分:1)
for (; itr != records.end(); ++itr)
不会转义容器并在循环体中未修改itr
或者递减时调用UB。
在这里你推进了迭代器:itr = records.erase(itr);
。
当你这样做时,不仅你跳过一个元素,你也可以跳过一个过去想象的“元素”,如果你增加超过一个结束的> strong>(UB)。