2012-10-12 2 views
51

Ho questo codice:Come iterare std :: set?

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

Non v'è alcun valore ->first. Come posso ottenere il valore?

risposta

88

È necessario annullare l'iteratore per recuperare il membro del set.

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

Se si dispone di C++ 11 caratteristiche, è possibile utilizzare un range-based for loop:

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

@ Mr.C64 Non che sia importante tanto con tipi integrali come in questo caso. –

+0

Potrebbe valere la pena notare che è necessario utilizzare il primo se si intende modificare il contenitore. Per i googler che è. –

+1

I cosa C++ 11 soluzione dovrebbe essere con riferimento (auto & f). È meglio per la maggior parte dei casi. Anche per questo caso specifico. – jaskmar

7

Basta usare il * prima it:

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

Questo dereferenzia e consente di accedere all'elemento su cui è in esecuzione l'iteratore.

+3

Solo una piccola nota: generalmente è preferibile usare ++ it anziché ++ in per loop per evitare una copia extra dell'iteratore. – user2891462

1

Si tratta di una soluzione completa alla domanda:

Come eseguire iterazioni 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 anche 'for (auto i: mset) std :: cout << i;' –

4

Un altro esempio per C++ 11 standart:

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

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