如何迭代std :: set?

Rom*_*man 79 c++ iteration set

我有这个代码:

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

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

Rob*_*obᵩ 122

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

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

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

for(auto f : SERVER_IPS) {
  // use f here
}    
Run Code Online (Sandbox Code Playgroud)

  • 我的C++ 11解决方案应该是引用(auto&f).对大多数情况来说更好.对于这个特定情况也是如此. (3认同)
  • 可能值得注意的是,如果您打算修改容器,则需要使用第一个。对于谷歌员工来说就是这样。 (2认同)
  • @BioCoder - 您可以使用引用变量,但它必须是 **const** 引用变量,例如:`const u_long&amp; f = *it;`。 (2认同)

Ram*_*rar 12

只需使用*之前it:

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

这取消了它并允许您访问迭代器当前所在的元素.

  • 只是一个小注意事项:通常首选使用++而不是++ for for循环来避免迭代器的一个额外副本. (5认同)

vit*_*rov 9

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

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

for (const int &number : data)
  cout << number;
Run Code Online (Sandbox Code Playgroud)


Lui*_*s B 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至`for(auto i : mset) std::cout &lt;&lt; i;` (3认同)