FBIagent
Erfahrenes Mitglied
Guten Abend,
ich iteriere über ein std::vector Objekt.
Ich möchte alle Elemente durchgehen, allerdings kann es vorkommen,
dass ich beim iterieren std::vector::erase aufrufe und somit der Iterator
ungültig wird.
Gibt es da eine Möglichkeit den Iterator auf das nächte
Element nach dem gelöschtem zeigen zu lassen?
ich iteriere über ein std::vector Objekt.
C++:
// interacting with clients
iter = Server->m_Clients.begin();
for ( ;iter != Server->m_Clients.end();++ iter ) {
ClErr = false;
if ( FD_ISSET( (*iter)->GetSock(), &ExceptFds ) ) {
ClErr = true;
(*iter)->OnForceDisconnect();
(*iter)->OnDisconnect();
} else {
if ( FD_ISSET( (*iter)->GetSock(), &ReadFds ) ) {
Interacted = recv( (*iter)->GetSock(), Buffer, 65537, 0 );
if ( Interacted == SOCKET_ERROR ) {
ClErr = true;
(*iter)->OnForceDisconnect();
(*iter)->OnDisconnect();
} else if ( Interacted == 0 ) {
ClErr = true;
(*iter)->OnDisconnect();
} else {
(*iter)->m_ReadBuffer.insert( (*iter)->m_ReadBuffer.end(), Buffer, Buffer + Interacted );
(*iter)->OnData();
}
}
if ( !ClErr && FD_ISSET( (*iter)->GetSock(), &WriteFds ) ) {
Interacted = (*iter)->m_WriteBuffer.size() > 65537 ? 65537 : (*iter)->m_WriteBuffer.size();
std::copy( (*iter)->m_WriteBuffer.begin(), (*iter)->m_WriteBuffer.begin() + Interacted, Buffer );
Interacted = send( (*iter)->GetSock(), Buffer, Interacted, 0 );
if ( Interacted == SOCKET_ERROR ) {
ClErr = true;
(*iter)->OnForceDisconnect();
(*iter)->OnDisconnect();
} else {
(*iter)->m_WriteBuffer.erase( (*iter)->m_WriteBuffer.begin(), (*iter)->m_WriteBuffer.begin() + Interacted );
}
}
}
// really?
/*FD_CLR( iter->m_Sock, &ExceptFds );
FD_CLR( iter->m_Sock, &WriteFds );
FD_CLR( iter->m_Sock, &ReadFds );*/
if ( ClErr ) {
delete *iter;
iter = Server->m_Clients.erase( iter );
}
Ich möchte alle Elemente durchgehen, allerdings kann es vorkommen,
dass ich beim iterieren std::vector::erase aufrufe und somit der Iterator
ungültig wird.
C++:
if ( ClErr ) {
delete *iter;
iter = Server->m_Clients.erase( iter );
}
Gibt es da eine Möglichkeit den Iterator auf das nächte
Element nach dem gelöschtem zeigen zu lassen?
Zuletzt bearbeitet von einem Moderator: