如何迭代std::set?

119

我有这段代码:

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

没有->first值。 我该如何获取这个值?

5个回答

197
你必须对迭代器进行解引用操作才能获取你的集合成员。
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 在这种情况下,对于整数类型来说并不重要。 - Some programmer dude
2
值得注意的是,如果您打算修改容器,则需要使用第一个。对于谷歌搜索者来说是这样。 - Legion Daeth
3
我认为C++11的解决方案应该使用引用(auto& f)。对于大多数情况来说这样更好。对于这个特定的案例也是如此。 - Mariusz Jaskółka
嗨Rob,如果我想引用SERVER_IPS中的元素而不是声明一个新的u_long变量怎么办?我可以使用u_long&f = *it吗?如果不行,我该怎么做? - BioCoder
2
@BioCoder - 你可以使用一个引用变量,但它必须是一个const引用变量,像这样:const u_long& f = *it; - Robᵩ
显示剩余2条评论

22

另一个符合C++11标准的例子:

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

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

19

只需在it之前使用*

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

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


10
小小的注意事项:通常在 for 循环中,使用 ++it 比 it++ 更受欢迎,以避免多余拷贝迭代器。 - user2891462

7

如何迭代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;
}

4
甚至可以使用 for(auto i : mset) std::cout << i; - Jack Deeth

2
还有一件对于初学者可能有用的事情是,由于std::set不是使用连续的内存块分配的,如果有人想要按照正常方式迭代到第k个元素,那么通常的方法将无法奏效。
例如:
std::vector<int> vec{1, 2, 3, 4, 5};
int k = 3;
for (auto itr = vec.begin(); itr < vec.begin() + k; itr++)
    cout << *itr << " ";

std::unordered_set<int> s{1, 2, 3, 4, 5};
int k = 3;
int index = 0;
auto itr = s.begin();
while (true)
{
    if (index == k)
        break;
    cout << *itr++ << " ";
    index++;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接