109

我有这个代码:

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

没有->first价值。我怎样才能获得价值?

4

5 回答 5

170

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

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
}    
于 2012-10-12T16:23:15.947 回答
19

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

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

for (const int &number : data)
  cout << number;
于 2016-12-09T08:17:55.277 回答
17

只需使用*之前it

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

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

于 2012-10-12T16:25:21.480 回答
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;
}
于 2016-05-19T18:59:16.943 回答
1

对初学者可能有用的另一件事是,因为 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-02-07T09:03:58.683 回答