假设我有一个无序集合
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];
无济于事。
假设我有一个无序集合
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];
无济于事。
你可以使用新的基于范围的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 ... */
}
unordered_set
直到那时才添加,但 Boost 也有一个,所以 OP 可能正在使用旧版的 C++ 与 Boost 的 unordered_set
。 - Michael Mrozekauto
关键字与使用的类型无关。auto
关键字甚至可以推断那些从 98 标准之前就没有改动过的类的类型。按照原文的描述,似乎 auto
只适用于新的类,或者必须在类中显式地设计。这只是一个小问题,但我认为值得澄清。 - Marcauto
只能从 C++11 开始使用。使用 --std=c++11
或显式命名迭代器类型(参见 @templatetypedef 的答案)。 - Kos到目前为止我没有使用过它们,但我猜想您可以像使用std::set
一样使用迭代器:
for(unordered_set<int>::iterator a = my_set.begin(); a != my_set.end(); ++a) {
int some_int = *a;
}
std::begin()
和std::end()
提供给你迭代器。 - Martin York