Come iterare std :: set?


91

Ho questo codice:

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

Non c'è ->firstvalore. Come posso ottenere il valore?

Risposte:


142

Devi dereferenziare l'iteratore per recuperare il membro del tuo 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 disponi di funzionalità C ++ 11, puoi utilizzare un ciclo for basato su intervalli :

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

@ Mr.C64 Non che importi molto con i tipi integrali come in questo caso.
Un tizio programmatore

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

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

Ciao Rob, cosa succede se voglio fare riferimento a elementi in SERVER_IPS diversi dalla dichiarazione di una nuova variabile u_long? Posso usare u_long & f = * it; ? E se no, cosa dovrei fare?
BioCoder

1
@BioCoder - È possibile utilizzare una variabile di riferimento, ma è necessario essere un const variabile di riferimento, in questo modo: const u_long& f = *it;.
Robᵩ

15

Usa solo *prima it:

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

Questo lo dereferenzia e ti consente di accedere all'elemento su cui si trova attualmente l'iteratore.


7
Solo una nota minore: generalmente si preferisce usarlo ++ invece di esso ++ nei cicli for per evitare una copia extra dell'iteratore.
user2891462

14

Un altro esempio per lo standard C ++ 11:

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

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

5

Come iterate 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 addiritturafor(auto i : mset) std::cout << i;
Jack Deeth
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.