2010-05-02 16 views
15

¿Cómo puedo recorrer un stl :: Listar y almacenar el valor de uno de los objetos para utilizarlo más adelante en la función?Obteniendo el valor de std :: list <> :: iterator to pointer?

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

¿Está tratando de decir que este código no se compila? '// failed' por lo general indica que significa un error en tiempo de ejecución. – rlbond

+0

@rlbond: estoy de acuerdo en que '// no se puede compilar" sería mejor (aunque en este ejemplo asumí que el error del compilador no era un efecto secundario no deseado al pegar el código), pero no estoy de acuerdo con eso// failed' _ "generalmente implica error en tiempo de ejecución" _. – sbi

Respuesta

53

De cualquier

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 mayor preferencia personal. :)

+4

Desplazarse hacia abajo fue en realidad una experiencia agradable. +1 – Potatoswatter

+0

closestParticle = & * it // ¡El truco! ¿Podría hacer que lo que está haciendo sea más detallado, lo estoy leyendo como: Ir a la dirección del puntero al iterador 'it'? – Onedayitwillmake

+3

Buena captura. Personalmente elegiría el # 2 como mi elección. Y estoy un poco confundido con # 3 y # 4. Parece que estás volviendo prematuramente. – rlbond

1

Para un list, la única forma de invalidar un iterador es erase. Así que sospecho que está llamando al list.erase(p1) en algún momento del ciclo. Debe hacer una copia del iterador, mover p1 hacia atrás uno y luego borrar la copia.

EDITAR: Oh, espera, ¿quiso decir que no compilar? 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.

+0

No estoy seguro de que haya respondido a la pregunta correcta. ¿Extrañé algo? – sbi

+0

Quise decir error del compilador, mi error no estaba al tanto de las convenciones :) - This one hizo el truco: más cercanoPartícula = &*it; // ¿Así que está diciendo? // ¿Ir a la dirección del puntero en él? – Onedayitwillmake

0

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 '&' para obtener su dirección y luego asignaría esa dirección a su variable de puntero. Es por eso que ptr = & * it; trabajos.

Cuestiones relacionadas