Como iterar std :: set?

91

Eu tenho este código:

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

Não tem ->firstvalor. Como posso obter o valor?

romano
fonte

Respostas:

139

Você deve desreferenciar o iterador para recuperar o membro de seu conjunto.

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

Se você tiver recursos do C ++ 11, poderá usar um loop for baseado em intervalo :

for(auto f : SERVER_IPS) {
  // use f here
}    
Robᵩ
fonte
@ Mr.C64 Não que importe muito com tipos integrais como neste caso.
Algum programador de
1
Pode ser interessante notar que você precisa usar o primeiro se pretende modificar o contêiner. Para os googlers, claro.
Legion Daeth
3
Acho que a solução C ++ 11 deve ser com referência (auto & f). É melhor para a maioria dos casos. Também para este caso específico.
jaskmar
Oi Rob, e se eu quiser fazer referência a elementos em SERVER_IPS além de declarar uma nova variável u_long? Posso usar u_long & f = * it; ? E se não, o que devo fazer?
BioCoder
1
@BioCoder - Você pode usar uma variável de referência, mas deve ser um const variável de referência, assim: const u_long& f = *it;.
Robᵩ
15

Basta usar o *antes it:

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

Isso cancela a referência e permite que você acesse o elemento em que o iterador está atualmente.

Rami Jarrar
fonte
7
Apenas uma pequena nota: geralmente é preferível usar ++ it em vez de ++ em loops for para evitar uma cópia extra do iterador.
user2891462
14

Outro exemplo para o padrão C ++ 11:

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

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

Como você itera 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;
}
Luis B
fonte
2
Ou mesmofor(auto i : mset) std::cout << i;
Jack Deeth