我想从c ++中的向量中擦除元素,但它显示运行时断言错误。
我的代码是:
int i=0;
for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
SOCKET clientSocket=*socketIterator;
isTrue=getBufferData(strt,stp,rm,clientSocket);
if(!isTrue){
vectClientSocket.erase(vectClientSocket.begin()+i);
vector<RMLObserver*>::iterator it;
for(it=vectRMLObserver.begin();it<vectRMLObserver.end();it++)
{
RMLObserver *observer = (RMLObserver*)*it;
observer->infosetSent(info->getRMLThinTranskportToken());
}
}
else
++socketIterator;
i++;
}
当删除一个元素时,它会显示运行时错误
请帮助我......提前谢谢你。
答案 0 :(得分:2)
删除元素后需要更新迭代器:
socketIterator = vectClientSocket.erase(socketIterator);
另见std :: vector&lt; ..&gt; :: erase(..)documentation
[编辑]
使用运算符!=(..)来比较迭代器:
for(socketIterator=vectClientSocket.begin();socketIterator!=vectClientSocket.end();){
答案 1 :(得分:1)
这一行之后:
vectClientSocket.erase(socketIterator);
socketIterator
是一个无效的迭代器,因为它用于指向的位置已被擦除。在这一行和你循环的下一次迭代之间你永远不会给它一个有效的值,所以下一次迭代中的这一行是一个无效的解引用。
SOCKET clientSocket=*socketIterator;
正如Simon指出的那样,即使在此之前,循环条件socketIterator<vectClientSocket.end()
也会导致未定义的行为,因为socketIterator
不再是vectClientSocket
的有效迭代器。