¿Cómo iterar std :: set?


91

Tengo este codigo:

std::set<unsigned long>::iterator it;
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) {
    u_long f = it; // error here
}

No hay ningún ->firstvalor. ¿Cómo puedo obtener el valor?

Respuestas:


142

Debe eliminar la referencia del iterador para recuperar el miembro de su conjunto.

std::set<unsigned long>::iterator it;
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) {
    u_long f = *it; // Note the "*" here
}

Si tiene características de C ++ 11, puede usar un bucle for basado en rango :

for(auto f : SERVER_IPS) {
  // use f here
}    

@ Mr.C64 No es que importe mucho con tipos integrales como en este caso.
Un tipo programador

1
Vale la pena señalar que debe usar el primero si tiene la intención de modificar el contenedor. Para los googlers, eso es.
Legion Daeth

3
Creo que la solución C ++ 11 debería ser con referencia (auto & f). Es mejor para la mayoría de los casos. También para este caso específico.
jaskmar

Hola Rob, ¿qué pasa si quiero hacer referencia a elementos en SERVER_IPS además de declarar una nueva variable u_long? ¿Puedo usar u_long & f = * it; ? Y si no, ¿qué debo hacer?
BioCoder

1
@BioCoder - Se puede usar una variable de referencia, pero debe ser un const variable de referencia, así: const u_long& f = *it;.
Robᵩ

15

Solo usa el *antes it:

set<unsigned long>::iterator it;
for (it = myset.begin(); it != myset.end(); ++it) {
    cout << *it;
}

Esto elimina la referencia y le permite acceder al elemento en el que se encuentra actualmente el iterador.


7
Solo una nota menor: generalmente se prefiere usar ++ en lugar de ++ en bucles for para evitar una copia adicional del iterador.
user2891462

14

Otro ejemplo para el estándar C ++ 11:

set<int> data;
data.insert(4);
data.insert(5);

for (const int &number : data)
  cout << number;

5

¿Cómo se itera std :: set?

int main(int argc,char *argv[]) 
{
    std::set<int> mset;
    mset.insert(1); 
    mset.insert(2);
    mset.insert(3);

    for ( auto it = mset.begin(); it != mset.end(); it++ )
        std::cout << *it;
}

2
O inclusofor(auto i : mset) std::cout << i;
Jack Deeth
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.