Как выполнить итерацию через неупорядоченный набор в С++?
Предположим, что у меня есть неупорядоченный набор
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];
безрезультатно.
Ответы
Ответ 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;
}