Подтвердить что ты не робот

Как выполнить итерацию через неупорядоченный набор в С++?

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

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];

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

4b9b3361

Ответ 1

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

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, возможно, потому, что у вас нет поддержки С++ 11 в вашем компиляторе:

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

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

Ответ 2

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

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

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

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