112 votes

Comment itérer std::set ?

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 pas ->first valeur. Comment puis-je obtenir cette valeur ?

175voto

Robᵩ Points 50501

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 des fonctionnalités de C++11, vous pouvez utiliser une fonction boucle for basée sur la gamme :

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

20voto

vitperov Points 48

Un autre exemple pour la norme C++11 :

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

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

18voto

Rami Jarrar Points 817

Il suffit d'utiliser le * 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.

6voto

Luis B Points 704

Comment itérer 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;
}

2voto

Roushan Kumar Points 11

Une autre chose qui pourrait être utile aux débutants est que, puisque std::set n'est pas alloué avec des morceaux de mémoire contigus, si quelqu'un souhaite itérer jusqu'à kth élément la manière normale ne fonctionnera pas. exemple :

std::vector<int > vec{1,2,3,4,5};
int k=3;
for(auto itr=vec.begin();itr<vec.begin()+k;itr++) cout<<*itr<<" ";

std::unordered_set<int > s{1,2,3,4,5};
int k=3;
int index=0;
auto itr=s.begin();
while(true){
   if(index==k) break;
   cout<<*itr++<<" ";
   index++;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X