2012-10-12 8 views
51

mam ten kod:Jak iterować std :: set?

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

nie ma wartości ->first. Jak mogę uzyskać wartość?

Odpowiedz

88

Musisz usunąć deskryptor iteratora w celu odzyskania elementu zestawu.

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

Jeśli masz C++ 11 funkcje, można użyć range-based for loop:

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

@ Mr.C64 nie to, że wiele spraw z integralnych typów jak w tym przypadku. –

+0

Warto zauważyć, że jeśli chcesz zmodyfikować kontener, musisz użyć pierwszego. Dla takich googlerzy. –

+1

I thing C++ 11 rozwiązanie powinno być z odniesieniem (auto & f). W większości przypadków jest to lepsze. W tym konkretnym przypadku. – jaskmar

7

Wystarczy użyć * przed it:

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

Ten dereferences go i pozwala na dostęp do elementu, którego iterator jest aktualnie włączony.

+3

Po prostu drobna uwaga: na ogół zaleca się użycie ++ zamiast pętli ++ w celu uniknięcia dodatkowej kopii iteratora. – user2891462

1

Jest to kompletne rozwiązanie do pytania:

Jak iteracyjne 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; 
} 
+1

Albo nawet 'dla (auto i: mset) std :: cout << i;' –

4

Innym przykładem dla C++ 11 standart:

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

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