Как перебрать неупорядоченный набор в C ++? - PullRequest
31 голосов
/ 01 февраля 2012

Предположим, у меня есть неупорядоченный набор

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

Как мне пройти через это? Мне не нужно повторять в любом порядке - до тех пор, пока я достигну каждого элемента один раз. Я пытался

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

безрезультатно.

Ответы [ 3 ]

53 голосов
/ 01 февраля 2012

Вы можете использовать новый диапазон для цикла:

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

Или вы можете использовать более традиционный цикл на основе итераторов:

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

Или, если у вас нет поддержки auto, возможно, потому что у вас нет поддержки C ++ 11 на вашем компиляторе:

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

Надеюсь, это поможет!

7 голосов
/ 01 февраля 2012

Как и любая другая коллекция:

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

Или несколько более общий способ с использованием перегрузок функций begin и end (вы можете писать перегрузки для своих собственных типов; они также работают с простыми массивами):

for (auto i = begin(my_set); i != end(my_set); ++i) { 
    ...
}
3 голосов
/ 01 февраля 2012

До сих пор никогда не использовал их, но я думаю, что вы можете использовать итератор так же, как вы используете std::set:

for(unordered_set<int>::iterator a = my_set.begin(); a != my_set.end(); ++a) {
    int some_int = *a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...