如何迭代std :: set?


91

我有以下代码:

std::set<unsigned long>::iterator it;
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) {
    u_long f = it; // error here
}

没有->first价值。我如何获得价值?

Answers:


142

您必须取消引用迭代器才能检索集合的成员。

std::set<unsigned long>::iterator it;
for (it = SERVER_IPS.begin(); it != SERVER_IPS.end(); ++it) {
    u_long f = *it; // Note the "*" here
}

如果您具有C ++ 11功能,则可以使用基于范围的for循环

for(auto f : SERVER_IPS) {
  // use f here
}    

@ Mr.C64在这种情况下,与整数类型无关紧要。
一些程序员花花公子

1
可能值得注意的是,如果要修改容器,则需要使用第一个容器。对于谷歌来说。
军团戴斯

3
我的C ++ 11解决方案应该参考(auto&f)。在大多数情况下效果更好。对于此特定情况也是如此。
jaskmar,2013年

嗨,罗布,如果我要引用SERVER_IPS中的元素而不是声明新的u_long变量,该怎么办?我可以使用u_long&f = * it; ?如果没有,我该怎么办?
BioCoder

1
@BioCoder-您可以使用参考变量,但它必须是const参考变量,例如:const u_long& f = *it;
罗伯(Robᵩ)

15

只需使用*之前it

set<unsigned long>::iterator it;
for (it = myset.begin(); it != myset.end(); ++it) {
    cout << *it;
}

这将取消引用它,并允许您访问迭代器当前所在的元素。


7
只需注意一点:在for循环中,通常最好使用++ it而不是它,以避免迭代器的一个额外副本。
user2891462

14

C ++ 11标准的另一个示例:

set<int> data;
data.insert(4);
data.insert(5);

for (const int &number : data)
  cout << number;

5

您如何迭代std :: set?

int main(int argc,char *argv[]) 
{
    std::set<int> mset;
    mset.insert(1); 
    mset.insert(2);
    mset.insert(3);

    for ( auto it = mset.begin(); it != mset.end(); it++ )
        std::cout << *it;
}

2
甚至for(auto i : mset) std::cout << i;
杰克·迪斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.