【问题标题】:How does one iterate through an unordered set in C++?如何遍历 C++ 中的无序集?
【发布时间】:2012-02-23 15:00:15
【问题描述】:

假设我有一个无序集

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

无济于事。

【问题讨论】:

  • 您使用迭代器来iterate。容器应该为您提供带有 std::begin()std::end() 的迭代器

标签: c++ c++11 iteration unordered-set


【解决方案1】:

您可以使用新的基于范围的 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 ... */
}

希望这会有所帮助!

【讨论】:

  • 为什么 boost 的 unordered_set 版本会破坏 C++11 的 auto 关键字?我认为您的意思是,“...也许是因为您使用的是较旧的编译器”或类似的东西。
  • @Marc 这个问题实际上并没有说任何关于 C++11 的内容;有人认为它必须是 C++11,因为直到那时还没有添加 unordered_set,但是 Boost 也有一个,所以 OP 可能使用带有 Boost unordered_set的旧 C++
  • @MichaelMrozek 是的,但在使用 C++11 编译器时,有人可能会出于其他原因使用 boost 版本。文本显示“或者,如果您没有自动支持,可能因为您使用的是 Boost 版本的 unordered_set”,但 auto 与所使用的类型无关。 auto 关键字将推断类型,即使对于自 '98 标准之前未触及的类也是如此。如所写,答案听起来好像 auto 仅适用于新类,或者必须明确设计到类中。这是一个小问题,但我认为值得澄清。
【解决方案2】:

就像任何其他收藏一样:

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

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

for (auto i = begin(my_set); i != end(my_set); ++i) { 
    ...
}

【讨论】:

  • 无论出于何种原因,我的编译器 (gcc) 都不知道“自动”是什么。也许我应该尝试“汽车”、“车辆”或“汽车”? :-) 现在说真的:下面的答案就像一个魅力。
  • @TravisBanger 那么你可能在 C++98 模式下运行,auto 只能从 C++11 开始使用。使用--std=c++11 或显式命名迭代器类型(参见@templatetypedef 的答案)
【解决方案3】:

到目前为止从未使用过它们,但我猜您可以像使用 std::set 一样使用迭代器:

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

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多