如何在C++中迭代无序集?

dan*_*007 32 c++ iteration unordered-set c++11

假设我有一个无序集

unordered_set<int> my_set;
myset.insert(1);
myset.insert(2);
myset.insert(3);
Run Code Online (Sandbox Code Playgroud)

我如何迭代它?我不需要以任何顺序迭代 - 只要我到达每个元素一次.我试过了

for (int i = 0; i < my_set.size(); i++)
     cout << my_set[i];
Run Code Online (Sandbox Code Playgroud)

无济于事.

tem*_*def 59

您可以使用新的基于范围的for循环:

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

或者,您可以使用更传统的基于迭代器的循环:

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

或者,如果您没有auto支持,可能是因为您的编译器没有C++ 11支持:

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

希望这可以帮助!

  • 为什么boost的unordered_set版本会破坏C++ 11的auto关键字?我想你的意思是,"......也许是因为你使用的是较旧的编译器",或类似的东西. (4认同)
  • @MichaelMrozek是的,但有人可能在使用C++ 11编译器时出于其他原因使用boost版本.文本说"或者,如果你没有自动支持,也许*因为你使用的是unordered_set*的Boost版本",但是`auto`与所使用的类型无关.即使对于自98年标准之前未被触及的类,`auto`关键字也将推断出类型.如上所述,答案使得听起来像auto只适用于新类,或者必须明确地设计成类.这是次要的,但我要说明一点. (3认同)
  • @Marc这个问题最初实际上并没有说明C ++ 11。有人认为它一定是C ++ 11,因为直到那时还没有添加`unordered_set`,但是Boost也有一个,因此OP可能正在使用带有Boost`unordered_set`的较旧的C ++。 (2认同)

Kos*_*Kos 8

就像任何其他集合一样:

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

或者使用重载beginend函数的一些更通用的方法(你可以为你自己的类型编写重载;它们也适用于普通数组):

for (auto i = begin(my_set); i != end(my_set); ++i) { 
    ...
}
Run Code Online (Sandbox Code Playgroud)