45 votes

Comment itérer dans un ensemble non ordonné en C++ ?

Supposons que j'ai un ensemble non ordonné

 unordered_set<int> my_set;
myset.insert(1);
myset.insert(2);
myset.insert(3);

Comment puis-je le parcourir ? Je n'ai pas besoin d'itérer dans n'importe quel ordre - du moment que j'atteigne chaque élément une fois. J'ai essayé

 for (int i = 0; i < my_set.size(); i++)
     cout << my_set[i];

en vain.

76voto

templatetypedef Points 129554

Vous pouvez utiliser la nouvelle boucle for basée sur la plage :

 std::unordered_set<T> mySet;
for (const auto& elem: mySet) {
    /* ... process elem ... */
}

Ou, vous pouvez utiliser la boucle plus traditionnelle basée sur un itérateur :

 std::unordered_set<T> mySet;
for (auto itr = mySet.begin(); itr != mySet.end(); ++itr) {
    /* ... process *itr ... */
}

Ou, si vous n'avez pas la prise en charge de auto , peut-être parce que vous n'avez pas la prise en charge de C++11 sur votre compilateur :

 std::unordered_set<T> mySet;
for (std::unordered_set<T>::iterator itr = mySet.begin(); itr != mySet.end(); ++itr) {
    /* ... process *itr ... */
}

J'espère que cela t'aides!

9voto

Kos Points 29125

Comme toute autre collection :

 for (auto i = my_set.begin(); i != my_set.end(); ++i) {
    std::cout << (*i) << std::endl;
}

Ou d'une manière un peu plus générique en utilisant des surcharges de fonctions begin et end (vous pouvez écrire des surcharges pour vos propres types ; elles fonctionnent également sur des tableaux simples) :

 for (auto i = begin(my_set); i != end(my_set); ++i) { 
    ...
}

3voto

Mario Points 16720

Je ne les ai jamais utilisés jusqu'à présent, mais je suppose que vous pouvez utiliser un itérateur de la même manière que vous le faites avec std::set :

 for(unordered_set<int>::iterator a = my_set.begin(); a != my_set.end(); ++a) {
    int some_int = *a;
}

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