print geeksforgeeks advance c++ stl iterator

geeksforgeeks - list iterator c++



Obtener el valor de std:: list<>:: iterator al puntero? (3)

No soy un experto en el STL, pero creo que la razón por la que no se puede compilar es porque un iterador es un objeto que apunta a otro objeto. En otras palabras, un iterador es una generalización de un puntero. Entonces, para hacer lo que desearía con cambios mínimos en su código, primero necesitaría desreferenciar el iterador para obtener el valor que contiene. Luego usaría ''y'' para obtener su dirección y luego asignaría esa dirección a su variable de puntero. Es por eso que ptr = & * it; trabajos.

¿Cómo puedo hacer un bucle a través de stl :: Listar y almacenar el valor de uno de los objetos para usarlo más adelante en la función?

Particle *closestParticle; for(list<Particle>::iterator p1 = mParticles.begin(); p1 != mParticles.end(); ++p1 ) { // Extra stuff removed closestParticle = p1; // fails to compile (edit from comments) }


Para una list , la única forma de invalidar un iterador es erase . Entonces sospecho que estás llamando a list.erase(p1) en algún punto del ciclo. Necesita hacer una copia del iterador, mover p1 una vez y luego borrar la copia.

EDITAR: Oh, espera, ¿quisiste decir que no compila ? Si es así, vea la respuesta de @ sbi. Pero realmente necesitas redactar tu pregunta de una buena manera. ¿Cuál es tu error de compilación? ¿O falla en el tiempo de ejecución? En este caso, sin embargo, creo que te refieres a un error de compilación.


Ya sea

Particle *closestParticle; for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it) { // Extra stuff removed closestParticle = &*it; }

o

list<Particle>::iterator closestParticle; for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it ) { // Extra stuff removed closestParticle = it; }

o

inline list<Particle>::iterator findClosestParticle(list<Particle>& pl) { for(list<Particle>::iterator it=pl.begin(); it!=pl.end(); ++it ) { // Extra stuff removed return it; } return pl.end(); }

o

template< typename It > inline It findClosestParticle(It begin, It end) { while(begin != end ) { // Extra stuff removed return begin; ++begin; } return end; }

Estos se ordenan en una preferencia personal creciente. :)