49

順序付けられていないセットがあるとします

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

無駄に。

4

3 に答える 3

83

新しい範囲ベースの for ループを使用できます。

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 ... */
}

お役に立てれば!

于 2012-01-31T21:30:42.140 に答える
9

他のコレクションと同じように:

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) { 
    ...
}
于 2012-01-31T21:31:00.973 に答える
3

これまでにそれらを使用したことはありませんが、イテレータを使用するのと同じ方法で使用できると思いますstd::set:

for(unordered_set<int>::iterator a = my_set.begin(); a != my_set.end(); ++a) {
    int some_int = *a;
}
于 2012-01-31T21:31:53.013 に答える