valoracion valor transacción transaccion son metodos mercancias los ley las incrementales incrementables exterior determinan dela cuáles como comercio articulo alternos aduanera aduana c++ memory-management vector iterator

c++ - valor - ¿Por qué este iterador vectorial no es incrementable?



valoracion aduanera valor de transaccion (8)

Estoy tratando de eliminar el contenido del vector y recibo un error: el iterador del vector no es incrementable, ¿por qué?

Este es mi destructor

City::~City() { vector <Base*>::iterator deleteIterator; for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++) m_basesVector.erase(deleteIterator); }

Gracias.


Cualquier iterador que apunte al elemento eliminado o a los elementos posteriores al que se elimina se invalida cuando se llama al método de borrado del vector. El método de borrado devuelve un iterador válido que apunta al siguiente elemento del vector. Debería usar ese iterador para continuar su bucle y no incrementar el iterador invalidado. También puede usar el método claro para eliminar todos los elementos del vector. Sin embargo, deberá recordar desasignar explícitamente cualquier memoria asignada para los elementos.


El problema es que está intentando usar un iterador mientras usa la función erase (). erase (), push_back (), insert () y otras funciones de modificación invalidan los iteradores en STL.

Solo usa la función clear ():

City::~City() { m_basesVector.clear(); }


Este código pierde todo el contenido del vector; también debe delete *deleteIterator en el bucle. Puede evitar todo esto usando Base lugar de Base* como el contenido del vector , luego clear() los destruirá por usted. O use boost::ptr_vector que automatiza la destrucción si necesita punteros en bruto.

Llamar a erase() en una iteración hacia adelante como esta puede ser muy costoso si el vector es grande, ya que cada elemento sobre la posición actual debe moverse hacia abajo para garantizar que los elementos permanezcan contiguos. Evite el borrado manual del tipo que usted propone, por esta y otras razones.


Esto no es relevante para el problema original publicado anteriormente, pero la búsqueda de Google sobre el error me lleva a esta página, así que la estoy publicando aquí para que cualquiera la vea.

Me encontré con este mensaje de error recientemente y todas las líneas de códigos se comprobaron (no hubo ningún ''borrado'' ni nada parecido; el vector simplemente se leyó).

Finalmente, me di cuenta de que hay un problema con los bucles anidados.

Por ejemplo, considera algo como esto:

`for (it=begin(); it!=end();i++) { for (; it!=end();i++) { } }`

Cuando haya terminado con el bucle anidado, incrementará el iterador, y luego, el bucle primario lo incrementará nuevamente (!), Haciendo que el iterador pase sobre el final (). Es decir, sería "end () + 1" si existiera tal cosa. En consecuencia, el bucle principal emite este error en la siguiente comprobación.

Para solucionar esto, terminé insertando esta línea después del bucle secundario:

`if (it == vStringList.end()) --it;`

Sucio, pero funciona: D

Sé que puede ser obvio para algunos, pero he estado rascándome la cabeza por un tiempo, lol


Los iteradores vectoriales son incrementables, pero si elimina elementos, los contenidos del vector se modifican y, por lo tanto, el iterador no es válido.

Por lo tanto, si elimina objetos, debe usar el valor de retorno de erase() que le proporciona el siguiente iterador válido.


Publicar esto solo en caso de que alguien más tenga este problema e intente esta solución preguntándose por qué no funciona, aquí hay una solución / explicación real.

@Steve Jessop: su código es defectuoso y también lo tiene escrito aquí ... (También he editado su publicación para solucionar el problema tan pronto como se apruebe, se solucionará en la publicación original)

http://techsoftcomputing.com/faq/3779252.html

No veo cómo se trata de una "Solución" al problema cuando se crea un nuevo problema al hacer un bucle sin fin, debería haber un deleteIterator ++ dentro del bucle while para que realmente llegue al final del vector.

También me he topado con este problema y mi solución estaba dentro del bucle while comprobando si el iterador era igual al final o si el tamaño del vector era 0 y rompía antes de intentar incrementar el iterador.

Ex.

std::vector<RankPlayer*>::iterator Rank_IT = CurrentPlayers.begin(); while ( Rank_IT != CurrentPlayers.end() ) { RankPlayer* SelPlayer = (*Rank_IT); if( strstr( SelPlayer->GamerTag, this->GamerTag ) != NULL ) { delete[] SelPlayer->PlayerData; delete[] SelPlayer; Rank_IT = CurrentPlayers.erase( Rank_IT ); } if( Rank_IT == CurrentPlayers.end() || CurrentPlayers.size() == 0 ) { break; } ++Rank_IT; }


Si está intentando liberar los datos en el vector, haga esto:

for (std::vector<Base*>::iterator it = v.begin(), e = b.end(); it != e; ++it) delete *it;


erase invalida el iterador. No puedes usarlo más. Por suerte para ti, devuelve un iterador que puedes usar:

vector <Base*>::iterator deleteIterator = m_basesVector.begin(); while (deleteIterator != m_basesVector.end()) { deleteIterator = m_basesVector.erase(deleteIterator); }

O:

m_basesVector.clear();

¿Eres responsable de liberar la memoria mencionada por los punteros en el vector? Si esa es la razón por la que está iterando (y su programa real tiene más código que no ha mostrado, que libera esos objetos en el bucle), tenga en cuenta que borrar desde el principio de un vector es una operación lenta, porque en cada paso, todos los elementos del vector tienen que desplazarse hacia abajo en un lugar. Sería mejor hacer un bucle sobre el vector liberándolo todo (luego clear() el vector, aunque como dice Mike, eso no es necesario si el vector es miembro de un objeto que está siendo destruido).