【问题标题】:How to iterate std::set?如何迭代 std::set?
【发布时间】:2012-10-03 12:23:33
【问题描述】:

我有这个代码:

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

没有-&gt;first 值。 如何获取价值?

【问题讨论】:

    标签: c++ set iteration


    【解决方案1】:

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

    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 的特性,你可以使用range-based for loop:

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

    【讨论】:

    • @Mr.C64 在这种情况下,整数类型并不重要。
    • 值得注意的是,如果您打算修改容器,则需要使用第一个。对于谷歌员工来说。
    • 我认为 C++11 解决方案应该参考 (auto& f)。大多数情况下更好。对于这种特定情况也是如此。
    • 嗨 Rob,如果我想引用 SERVER_IPS 中的元素而不是声明一个新的 u_long 变量怎么办?我可以使用 u_long & f = *it; ?如果没有,我该怎么办?
    • @BioCoder - 您可以使用引用变量,但它必须是 const 引用变量,如下所示:const u_long&amp; f = *it;
    【解决方案2】:

    只需在it 之前使用*

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

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

    【讨论】:

    • 只是一个小提示:通常最好在 for 循环中使用 ++it 而不是 it++ 以避免迭代器的一个额外副本。
    【解决方案3】:

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

    【讨论】:

    • 甚至for(auto i : mset) std::cout &lt;&lt; i;
    【解决方案4】:

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

    set<int> data;
    data.insert(4);
    data.insert(5);
    
    for (const int &number : data)
      cout << number;
    

    【讨论】:

      【解决方案5】:

      对初学者可能有用的另一件事是,由于 std::set 没有分配连续的内存块,如果有人想迭代直到 kth 元素,正常方式将无法正常工作。 示例:

      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++;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2015-06-11
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多