web-dev-qa-db-fra.com

Comment peut-on parcourir 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 - tant que j'atteins chaque élément une fois. j'ai essayé

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

en vain.

31
dangerChihuahua007

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 basée sur un itérateur plus traditionnelle:

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

Ou, si vous n'avez pas de support auto, peut-être parce que vous n'avez pas de support 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!

56
templatetypedef

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) { 
    ...
}
8
Kos

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;
}
3
Mario