2012-10-12 66 views
51

tengo este código:Cómo iterar std :: set?

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

No hay valor ->first. ¿Cómo puedo obtener el valor?

Respuesta

88

Debe desreferenciar el 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 C++ 11 rasgos, se puede utilizar un range-based for loop:

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

@ Mr.C64 No es que importe mucho con tipos enteros como en este caso. –

+0

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

+1

Creo que la solución C++ 11 debe ser con referencia (auto y f). Es mejor para la mayoría de los casos. Para este caso específico también. – jaskmar

7

sólo tiene que utilizar el * antes it:

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

Esto elimina referencia a ella y le permite acceder al elemento en el que el iterador está actualmente.

+3

Una nota menor: generalmente se prefiere usar ++ en lugar de ++ para los bucles para evitar una copia adicional del iterador. – user2891462

1

Ésta es una solución completa a la pregunta:

¿Cómo iterar 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; 
} 
+1

O incluso 'para (auto i: mset) std :: cout << i;' –

4

Otro ejemplo para C++ 11 standart:

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

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