Comment parcourir std :: set?

91

J'ai ce code:

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

Il n'y a aucune ->firstvaleur. Comment puis-je obtenir la valeur?

romain
la source

Réponses:

139

Vous devez déréférencer l'itérateur afin de récupérer le membre de votre ensemble.

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

Si vous disposez de fonctionnalités C ++ 11, vous pouvez utiliser une boucle for basée sur une plage :

for(auto f : SERVER_IPS) {
  // use f here
}    
Robᵩ
la source
@ Mr.C64 Pas que cela compte beaucoup avec les types intégraux comme dans ce cas.
Un mec programmeur
1
Il peut être intéressant de noter que vous devez utiliser le premier si vous avez l'intention de modifier le conteneur. Pour les googleurs.
Legion Daeth
3
Je pense que la solution C ++ 11 devrait être avec référence (auto & f). C'est mieux dans la plupart des cas. Pour ce cas précis également.
jaskmar
Salut Rob, que faire si je veux référencer des éléments dans SERVER_IPS autrement que déclarer une nouvelle variable u_long? Puis-je utiliser u_long & f = * it; ? Et si non, que dois-je faire?
BioCoder
1
@BioCoder - Vous pouvez utiliser une variable de référence, mais il doit être une const variable de référence, comme suit: const u_long& f = *it;.
Robᵩ
15

Utilisez simplement l' *avant it:

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

Cela le déréférence et vous permet d'accéder à l'élément sur lequel l'itérateur se trouve actuellement.

Rami Jarrar
la source
7
Juste une petite note: il est généralement préférable de l'utiliser ++ au lieu de lui ++ dans les boucles for pour éviter une copie supplémentaire de l'itérateur.
user2891462
14

Un autre exemple pour le standard C ++ 11:

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

for (const int &number : data)
  cout << number;
Vitperov
la source
5

Comment itérez-vous 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;
}
Luis B
la source
2
Ou mêmefor(auto i : mset) std::cout << i;
Jack Deeth