Wie iteriere ich std :: set?

90

Ich habe diesen Code:

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

Es gibt keinen ->firstWert. Wie kann ich den Wert erhalten?

römisch
quelle

Antworten:

137

Sie müssen den Iterator dereferenzieren, um das Mitglied Ihres Satzes abzurufen.

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

Wenn Sie über C ++ 11-Funktionen verfügen, können Sie eine bereichsbasierte for-Schleife verwenden :

for(auto f : SERVER_IPS) {
  // use f here
}    
Robᵩ
quelle
@ Mr.C64 Nicht, dass es bei integralen Typen wie in diesem Fall sehr wichtig wäre.
Einige Programmierer Typ
1
Es kann erwähnenswert sein, dass Sie den ersten verwenden müssen, wenn Sie den Container ändern möchten. Für die Googler ist das.
Legion Daeth
3
Ich denke, C ++ 11-Lösung sollte mit Referenz sein (auto & f). In den meisten Fällen ist es besser. Auch für diesen speziellen Fall.
Jaskmar
Hallo Rob, was ist, wenn ich andere Elemente in SERVER_IPS referenzieren möchte, als eine neue Variable u_long zu deklarieren? Kann ich u_long & f = * it; ? Und wenn nicht, was soll ich tun?
BioCoder
1
@BioCoder - Sie können eine Referenzgröße verwenden, aber es muss eine seiner const Referenzgröße, etwa so: const u_long& f = *it;.
Robᵩ
15

Verwenden Sie einfach das *vorher it:

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

Dadurch wird dereferenziert und Sie können auf das Element zugreifen, auf dem sich der Iterator gerade befindet.

Rami Jarrar
quelle
7
Nur eine kleine Anmerkung: Es wird im Allgemeinen bevorzugt, ++ anstelle von ++ in for-Schleifen zu verwenden, um eine zusätzliche Kopie des Iterators zu vermeiden.
user2891462
14

Ein weiteres Beispiel für den C ++ 11-Standard:

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

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

Wie iteriert man 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.
quelle
2
Oder sogarfor(auto i : mset) std::cout << i;
Jack Deeth